首页 > 解决方案 > Hazelcast MultiMap LocalEntryListener 提供了不正确的空值

问题描述

MultiMap<String, Integer> multiMap = hazelcastInstance.getMultiMap("mymap");
multiMap.addLocalEntryListener(new EntryListener<String, Integer>() {
    @Override
    public void entryAdded(EntryEvent<String, Integer> event) {
          System.out.println("******" + event);
    }

    @Override
    public void entryRemoved(EntryEvent<String, Integer> event) {
          System.out.println("******" + event);
    }
      ...
});

multiMap.put("1", 1);
multiMap.remove("1", 1);
******EntryEvent{entryEventType=ADDED, member=Member [172.24.22.28]:5702 - 5fb398ff-c034-478e-9a89-ebd3603fd2fd this, name='mymap', key=1, oldValue=null, value=null, mergingValue=null}

******EntryEvent{entryEventType=REMOVED, member=Member [172.24.22.28]:5702 - 5fb398ff-c034-478e-9a89-ebd3603fd2fd this, name='mymap', key=1, oldValue=null, value=null, mergingValue=null}

Hazelcast MultiMap LocalEntryListener 提供了不正确的空值。我无法通过侦听器获取原始值。我该如何解决这个问题。

标签: hazelcast

解决方案


目前MultiMap不支持使用includeValue选项添加本地侦听器,尽管没有理由不应该这样做,请参阅github 问题

作为一种解决方法,您可以将 multimap 转换为AbstractDistributedObject并将侦听器直接添加到MultiMapService.

EntryListener<String, Integer> listener = new EntryListener<String, Integer>() {
@Override
public void entryAdded(EntryEvent<String, Integer> event) {
    System.out.println("******" + event);
}
@Override
public void entryRemoved(EntryEvent<String, Integer> event) {
    System.out.println("******" + event);
}
...
};
AbstractDistributedObject<MultiMapService> multiMapProxy = (AbstractDistributedObject) multiMap;
multiMapProxy.getService().addLocalListener("mymap", listener, null, true);

推荐阅读