我在Hazelcast中使用Map store来绘制地图。我正在修改Map store中的一个对象。我的map store也实现了PostProcessingMapStore接口。
我创建了一个向缓存执行Map.put的客户端。这个put触发了MapStore上的存储。我也在客户端有一个监听器。当我尝试做map.get时,我得到了修改后的对象(因为PostProcessingMapStore),但是监听器中的条目添加方法显示了未修改的对象。我缺少一些配置吗?
答案 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