2014-10-27 63 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