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

时间:2015-10-27 18:13:46

标签: java caching hazelcast

我在Hazelcast中使用Map store来绘制地图。我正在修改Map store中的一个对象。我的map store也实现了PostProcessingMapStore接口。

我创建了一个向缓存执行Map.put的客户端。这个put触发了MapStore上的存储。我也在客户端有一个监听器。当我尝试做map.get时,我得到了修改后的对象(因为PostProcessingMapStore),但是监听器中的条目添加方法显示了未修改的对象。我缺少一些配置吗?

1 个答案:

答案 0 :(得分:0)

我认为这是一种预期的行为。将元素放入映射时,将触发侦听器的entryAdded方法。它不会受到PostProcessingMapStore更新的影响或触发,因为它已被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;
    }
}
}

输出:

entry added: 1
last: 2