是否可以嵌套hazelcast IMap?我可以期待哪些副作用?无论如何这是一个好主意吗?

时间:2014-10-31 10:01:23

标签: java hazelcast

我只是想知道是否可以嵌套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 ...只是因为这段代码正在运行我不确定这是否是一个好主意,如果我在分布式集群系统中使用它。有谁知道这会产生哪些副作用?

1 个答案:

答案 0 :(得分:0)

可能(从序列化方面)但我不建议它完成。