Java Hazelcast映射侦听器在映射存储中更新后未获取更新的对象

Java Hazelcast映射侦听器在映射存储中更新后未获取更新的对象,java,caching,hazelcast,Java,Caching,Hazelcast,我正在为Hazelcast中的地图使用地图存储。我正在修改地图存储中的一个对象。我的地图存储还实现了后处理地图存储接口 我创建了一个客户端,该客户端对缓存执行Map.put。此put触发MapStore上的存储。我在客户端也有一个映射侦听器。当我尝试执行Map.get时,我会将修改过的对象取回(因为后处理MapStore),但是侦听器中添加的条目方法显示了未修改的对象。我是否缺少一些配置?我认为这是一种预期行为。将元素放入映射时,将触发侦听器的entryAdded方法。后处理MapStore的更

我正在为Hazelcast中的地图使用地图存储。我正在修改地图存储中的一个对象。我的地图存储还实现了后处理地图存储接口


我创建了一个客户端,该客户端对缓存执行Map.put。此put触发MapStore上的存储。我在客户端也有一个映射侦听器。当我尝试执行Map.get时,我会将修改过的对象取回(因为后处理MapStore),但是侦听器中添加的条目方法显示了未修改的对象。我是否缺少一些配置?

我认为这是一种预期行为。将元素放入映射时,将触发侦听器的entryAdded方法。后处理MapStore的更新不会影响或触发它,因为put操作已经调用了它

我试图创建你的场景。代码如下:

public class Main  {        

public static void main(String[] args){
    Config config = new Config();
    MapConfig mapConfig = config.getMapConfig("map");
    MapStoreConfig mapStoreConfig = new MapStoreConfig();
    mapStoreConfig.setEnabled(true).setClassName(IncrementerPostProcessingMapStore.class.getName());
    mapConfig.setMapStoreConfig(mapStoreConfig);

    HazelcastInstance instance = Hazelcast.newHazelcastInstance(config);
    HazelcastInstance client = HazelcastClient.newHazelcastClient();

    IMap<Integer, SampleObject> map = client.getMap("map");
    map.addEntryListener(new EntryAdapter<Object, SampleObject>() {
        @Override
        public void entryAdded(EntryEvent<Object, SampleObject> event) {
            System.out.println("entry added:" + event.getValue().version);
        }
    }, true);

    map.put(1, new SampleObject(1));

    System.out.println("last:" + map.get(1).version);
}

public static class IncrementerPostProcessingMapStore implements MapStore<Integer, SampleObject>, PostProcessingMapStore {

    Map<Integer, SampleObject> map = new ConcurrentHashMap<Integer, SampleObject>();

    @Override
    public void store(Integer key, SampleObject value) {
        value.version++;
        map.put(key, value);
    }
    ...
}

public static class SampleObject implements Serializable {

    public int version;

    public SampleObject(int version) {
        this.version = version;
    }
}
}

我认为在map store完成其工作后会调用entry added方法。与map.get调用类似,这应该有更新的值。在上面的示例中,我希望entry added为2…是否有其他方法可以在listener方法中获得此更新的值?这是一个错误。通过侦听器发送未修改的值是没有意义的。发送侦听器值应在映射存储处理完该项后完成。
entry added: 1
last: 2