Search code examples
hazelcast

Hazelcast MultiMap LocalEntryListener provides incorrect null values


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 provides incorrect null values. I cannot get the origin value through Listener. How can I resolve this problem.


Solution

  • Currently MultiMap does not support adding local listener with includeValue option, though there is no reason that it should not, see the github issue.

    As a workaround, you can cast multimap to AbstractDistributedObject and add the listener directly to the 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);