【问题标题】:Getting listeners on Hazelcast objects获取 Hazelcast 对象的侦听器
【发布时间】:2014-10-27 15:03:01
【问题描述】:

有没有办法让 Hazelcast 中的一个对象的所有侦听器?

这是我的用例。我创建了一堆队列并将一个到多个侦听器附加到这些队列。随着时间的推移,其中一些侦听器将被删除,我想在没有侦听器时删除队列。我意识到我可以在我的代码中维护一个外部结构来跟踪所有队列和相关的侦听器,但是如果我可以使用 Hazelcast 本身来做到这一点会很好。理想情况下,queue.getListeners() 之类的东西会返回一个侦听器 ID 列表。

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

【问题讨论】:

    标签: hazelcast


    【解决方案1】:

    您可以使用 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());
        }
    }
    

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

    【讨论】:

    • PS:您可以将操作发送给拥有队列的成员,方法是使用队列名称并结合: OperationService: InternalCompletableFuture invokeOnPartition(String serviceName, Operation op, int partitionId);
    猜你喜欢
    • 1970-01-01
    • 2013-04-19
    • 2014-12-24
    • 1970-01-01
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    相关资源
    最近更新 更多