我只是想知道是否可以嵌套IMaps。快速而简单的方式说" no"。
@Test
public void nest(){
HazelcastInstance instance = Hazelcast.newHazelcastInstance();
IMap<Object, Object> foo = instance.getMap("foo");
IMap<Object, Object> bar = instance.getMap("bar");
bar.lock("bar key");
bar.set("bar key", "mmmmm");
bar.unlock("bar key");
foo.lock("foo key");
foo.set("foo key", bar);
foo.unlock("foo key");
System.out.println(foo);
}
结果:
com.hazelcast.nio.serialization.HazelcastSerializationException: There is no suitable serializer for class com.hazelcast.map.proxy.MapProxyImpl
at com.hazelcast.nio.serialization.SerializationServiceImpl.toData(SerializationServiceImpl.java:215)
at
但我的意思是在一天结束时我们只需知道嵌套的地图名称对吗?所以我做了一个快速而肮脏的镜头:
@Test
public void nest(){
HazelcastInstance instance = Hazelcast.newHazelcastInstance();
IMap<Object, Object> foo = instance.getMap("foo");
IMap<Object, Object> bar = instance.getMap("bar");
bar.lock("bar key");
bar.set("bar key", "mmmmm");
bar.unlock("bar key");
foo.lock("foo key");
foo.set("foo key", new NestedIMap("bar"));
foo.unlock("foo key");
for (Object ky : foo.keySet()) {
Object o = foo.get(ky);
if (o instanceof NestedIMap) {
NestedIMap bar1 = (NestedIMap) o;
bar1.setInstance(instance);
System.out.println("nested map");
for (Object ky2 : bar1.keySet()) {
System.out.println(bar1.get(ky2));
}
} else {
System.out.println(o);
}
}
}
public static class NestedIMap<K, V> implements Map<K, V>, Serializable {
private final String name;
private transient HazelcastInstance instance = null;
private transient IMap cache = null;
public NestedIMap(String name) {
this.name = name;
}
public void setInstance(HazelcastInstance instance) {
this.instance = instance;
}
public IMap<K,V> getIMap() {
return cache != null ? cache : (cache = instance.getMap(name));
}
@Override
public int size() {
return getIMap().size();
}
@Override
public boolean isEmpty() {
return getIMap().isEmpty();
}
@Override
public boolean containsKey(Object key) {
return getIMap().containsKey(key);
}
@Override
public boolean containsValue(Object value) {
return getIMap().containsValue(value);
}
@Override
public V get(Object key) {
return getIMap().get(key);
}
@Override
public V put(K key, V value) {
return getIMap().put(key,value);
}
@Override
public V remove(Object key) {
return getIMap().remove(key);
}
@Override
public void putAll(Map<? extends K, ? extends V> m) {
getIMap().putAll(m);
}
@Override
public void clear() {
getIMap().clear();
}
@Override
public Set<K> keySet() {
return getIMap().keySet();
}
@Override
public Collection<V> values() {
return getIMap().values();
}
@Override
public Set<Entry<K, V>> entrySet() {
return getIMap().entrySet();
}
@Override
public String toString() {
return getIMap().toString();
}
}
Soo ...只是因为这段代码正在运行我不确定这是否是一个好主意,如果我在分布式集群系统中使用它。有谁知道这会产生哪些副作用?
答案 0 :(得分:0)
可能(从序列化方面)但我不建议它完成。