我使用IMap对象在群集节点之间共享一些信息。 此信息与节点相关,并由共享映射中的同一节点插入,因此如果从群集中删除该节点,那么就没有意义。
我知道存在一个MemberShipListener,我可以捕获事件memberRemoved,但我不知道如何删除被删除成员拥有的条目。所以我想知道是否存在一种可以自动完成的方法。
答案 0 :(得分:2)
没有自动方式,至少不是我所知道的,但是你可以建立一个小的解决方法。为此,您需要保留第二个数据结构(MultiMap),以保存有关成员及其分配键的唯一ID的信息。以下显示了一些伪代码:
class MapWrapper<K, V> {
MultiMap<String, K> metadata = hazelcastInstance.getMultiMap("metadata");
Cluster cluster = hazelcastInstance.getCluster();
Member localMember = cluster.getLocalMember();
String uuid = localMember.getUuid();
IMap<K, V> realMap = hazelcastInstance.getMap("...");
public void putWrapper(K key, V value) {
realMap.put(key, value);
metadata.put(uuid, key);
}
}
您可以使用MembershipListerner,首先通过向集群询问所有成员并获取结果集中的第一个来测试当前节点是否为“领导者”(集群中最早的成员)。
Cluster cluster = hazelcastInstance.getCluster();
Member leader = cluster.getMembers().iterator().next();
if (cluster.getLocalMember().equals(leader)) { ... }
现在,因为您知道此操作只会发生一次(仅限于领导者),只需使用元数据删除以下元素:
void memberRemoved(MembershipEvent membershipEvent) {
if (isLeader()) {
Member removedMember = membershipEvent.getMember();
Collection<K> keys = metadata.remove(removedMember.getUuid());
realMap.removeAll(keys);
}
}
可能不是你想要的好解决方案,但到目前为止我还没有看到另一种方法来处理你的用例。我期待着其他解决方案:)