2014-10-27 58 views
0

是否有任何方法可以获取Hazelcast中所有对象的听众?在Hazelcast对象上获取听众

这是我的使用案例。我创建了一堆队列,并将一个到多个监听器连接到这些队列。随着时间的推移,这些监听器中的一些将被删除,我想在没有监听器时删除队列。我意识到我可以在我的代码中维护一个外部结构,以便跟踪所有队列和相关的听众,但如果我可以使用Hazelcast本身来执行此操作,那将会很好。理想情况下,像queue.getListeners()这将返回一个侦听器ID列表。

我没有看到任何方式在Hazelcast文档中做这样的事情。有没有更好的方法来完成我想要做的事情?

回答

2

您可以使用SPI访问侦听器。这是一些示例代码,当事件发生时触发器被触发(例如put)。

public void publishEvent(ItemEventType eventType, Data data) { 
    EventService eventService = getNodeEngine().getEventService(); 
    Collection<EventRegistration> registrations = eventService.getRegistrations(getServiceName(), name); 
    Address thisAddress = getNodeEngine().getThisAddress(); 
    for (EventRegistration registration : registrations) { 
     QueueEventFilter filter = (QueueEventFilter) registration.getFilter(); 
     QueueEvent event = new QueueEvent(name, filter.isIncludeValue() ? data : null, eventType, thisAddress); 
     eventService.publishEvent(getServiceName(), registration, event, name.hashCode()); 
    } 
} 

那么,你所能做的就是创建自己的操作,并让它执行定期拥有该队列中的部件(队列不分区),并检查监听计数。如果没有听众和某种宽限期超过,您可以销毁该队列。

+0

PS:可以操作发送到通过组合使用的队列名称与拥有该队列中的构件: OperationService: InternalCompletableFuture invokeOnPartition(字符串服务名,操作运算,INT的partitionid); – pveentjer 2014-10-28 06:58:45