获取Hazelcast对象的侦听器

获取Hazelcast对象的侦听器,hazelcast,Hazelcast,有没有办法获取Hazelcast中某个对象的所有侦听器 这是我的用例。我创建了一组队列,并将一个到多个侦听器连接到这些队列。随着时间的推移,其中一些侦听器将被删除,我希望在没有侦听器时删除队列。我意识到我可以在代码中维护一个外部结构,它可以跟踪所有队列和关联的侦听器,但是如果我可以使用Hazelcast本身来实现这一点,那就太好了。理想情况下,类似于queue.getListeners()的东西将返回侦听器ID列表 我在Hazelcast文档中看不到任何类似的方法。有没有更好的方法来完成我想做的

有没有办法获取Hazelcast中某个对象的所有侦听器

这是我的用例。我创建了一组队列,并将一个到多个侦听器连接到这些队列。随着时间的推移,其中一些侦听器将被删除,我希望在没有侦听器时删除队列。我意识到我可以在代码中维护一个外部结构,它可以跟踪所有队列和关联的侦听器,但是如果我可以使用Hazelcast本身来实现这一点,那就太好了。理想情况下,类似于
queue.getListeners()
的东西将返回侦听器ID列表


我在Hazelcast文档中看不到任何类似的方法。有没有更好的方法来完成我想做的事情?

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

public void publishEvent(ItemEventType、eventType、Data){
EventService EventService=getNodeEngine().getEventService();
集合注册=eventService.getRegistrations(getServiceName(),name);
地址thisAddress=getNodeEngine().getThisAddress();
用于(事件注册:注册){
QueueEventFilter=(QueueEventFilter)注册。getFilter();
QueueEvent事件=新的QueueEvent(名称,filter.isIncludeValue()?数据:null,eventType,thisAddress);
publishEvent(getServiceName(),注册,事件,name.hashCode());
}
}

因此,您可以创建自己的操作,并定期在拥有队列(队列未分区)的成员上执行该操作,然后检查侦听器计数。如果没有侦听器,并且超过了某种宽限期,则可以销毁队列。

PS:您可以将队列名称与:OperationService:InternalCompletableFuture invokeOnPartition(字符串serviceName、operation op、int partitionId)结合使用,将操作发送给拥有队列的成员;
 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());
    }
}