-
Bug
-
Resolution: Done
-
Major
-
6.0.0.Final
Here is the implementation of remoteCahe.getAsync() :
public NotifyingFuture<V> getAsync(final K key) { assertRemoteCacheManagerIsStarted(); final NotifyingFutureImpl<V> result = new NotifyingFutureImpl<V>(); Future<V> future = executorService.submit(new Callable<V>() { @Override public V call() throws Exception { V toReturn = get(key); result.notifyFutureCompletion(); return toReturn; } }); result.setExecuting(future); return result; }
2 problems here :
1. Callable's call method might be called BEFORE calling client had a chance to add listener (i.e. getAsync is not returned yet), in this case its' listener futureDone method will never be called.
2. Even case #1 has not happened and notifyFutureCompletion is called on listener, but the future is not resolved yet : "call" has not returned, that's why the future that is passed to listener is not resolved, and calling future.get from listener blocks forever.