Listeners and Notifications_CN(Listeners和Notifications)

Infinispan 提供了一个listener API,通过该API客户端能够进行注册并且当事件发生时能后获取通知。 这个注释驱动的 API可以应用到两个不同的级别: cache事件级别和cache manager事件级别。

 

事件触发一个通知,这个通知将会被分发到对应listeners。Listeners是简单的 POJOs,标记有 @Listener 注释并且通过 Listenable 接口中提供的方法进行注册。

CacheCacheManager 都实现了Listenable接口,也就意味着你能够讲listeners注册到cache或者cache manager上,以便能够获取 cache级别或者cache manager级别的通知。


例如,下面的类定义了一个listener, 每次数据项被添加到缓存时都会输出信息:

 

@Listener

public class PrintWhenAdded {

 

  @CacheEntryCreated

  public void print(CacheEntryCreatedEvent event) {

    System.out.println("New entry " + event.getKey() + " created in the cache");

  }

 

}

 

更多全面的例子请参照 Javadocs for @Listener.

Cache级别的notifications

Cache级别事件是基于单个缓存发生的,并且是全局和集群范围的。 cache级别事件的例子包括添加、移除和修改数据项等等。这些时间会触发通知被发送到注册到特定缓存的listeners。

 

关于cache级别的notifications及其方法级注释的更详尽列表请参照 org.infinispan.notifications.cachelistener.annotation包的Javadocs

 

Cache manager级别notifications

Cache manager级别的时间是基于cache manager发生的。它们也是全局和集群范围的,但是相关的时间会影响此cache manager创建的所有缓存实例。缓存中加入或者移除节点或者缓存的启动和停止都是cache manager级别事件的例子。

 

关于cache manager级别的notifications及其方法级注释的更详尽列表请参照org.infinispan.notifications.cachemanagerlistener.annotation 包中的JavaDoc

同步

默认情况下,所有的notifications都是由产生事件的线程分发的。这也就意味着自定义的listener不能够阻塞或者消耗过长的时间,因为它将会阻止处理线程。另一种方案是,你可以声明这些listeners为异步执行,这样将会产生一个单独的线程池来用户分发notification而不会阻塞原有的进程。你可以通过下面的注释来完成:

 

@Listener (sync = false)

public class MyAsyncListener { .... }

 

异步线程池

为了将线程池改变成异步的分发通知,可以在配置文件中使用 <asyncListenerExecutor /> XML元素。