[infinispan-dev] Async Notification API

Manik Surtani manik at jboss.org
Tue May 19 05:59:31 EDT 2009


Hi David

Yes, this does look good - I have started a discussion on concurrency- 
interest on the subject as well.  You should contrib these thoughts  
there as well.

Cheers
Manik

On 18 May 2009, at 15:07, David M. Lloyd wrote:

> On 05/15/2009 06:27 PM, Manik Surtani wrote:
>> While the new async API has been getting rave reviews, someone did  
>> bring up async notifications.  E.g.,
>>    Future f = cache.putAsync(k, v);
>>    f.get();
>> But what if I don't want to wait on f.get(), I'd rather be told  
>> when the future is done so I can do an f.get()?
>
> In XNIO, I've solved this problem simply by using a new IoFuture  
> type that can have notifiers registered on it, not unlike your  
> NotifyingFuture example (which, by the way, works very well).
>
> http://anonsvn.jboss.org/repos/xnio/xnio-base/trunk/api/src/main/java/org/jboss/xnio/IoFuture.java
>
> Notice a couple of things that I learned the hard way.  
> future.addNotifier() accepts a notifier and an attachment (allowing  
> the same notifier to be reused by the user if so desired).  The  
> notifier itself is called in any of three possible cases: success,  
> cancellation (which may not apply to your use case), and failure.   
> The notifier has a single notify method which is called in any case  
> (an IoFuture has a getStatus() method which returns an enum value).   
> There is an abstract class which has separate handleDone/ 
> handleCancelled/handleFailure methods, each with an empty default  
> implementation; this allows users to easily create anonymous classes  
> which only implement, say, handleDone, while still allowing a single  
> method implementation which is called when any status change occurs.
>
> Finally, the addNotifier method has a signature like this:
>
> public interface IoFuture<T> {
>  ...
>  <A> IoFuture<T> addNotifier(Notifier<? super T, A> notifier, A  
> attachment);
>  ...
> }
>
> This allows users to register notifiers for IoFutures of any  
> superclass type of the result.  This means, for example, that a  
> Notifier<Object, ?> can be registered on any IoFuture, while a  
> Notifier<Closeable, ?> can be registered on just about any IoFuture  
> that returns an I/O entity (think async close after an operation  
> completes).
>
> One other lesson I've learned that may be useful to you even if you  
> opt to stick with Future<T> is that you should always use Future<?  
> extends Whatever> rather than Future<Whatever>, and encourage your  
> users to do the same, which gives you a little more flexibility with  
> respect to covariance.
>
> While I doubt that IoFuture is directly applicable to your  
> situation, hopefully you won't have to relearn the same lessons the  
> hard way. :-)
>
> - DML

--
Manik Surtani
manik at jboss.org
Lead, Infinispan
Lead, JBoss Cache
http://www.infinispan.org
http://www.jbosscache.org







More information about the infinispan-dev mailing list