4

现在我们正在使用默认选项 .getMap() 创建地图。我们不使用 getConfig().addMapConfig 选项,因为我们希望避免检查地图是否为空等,以避免每次需要访问地图时调用此代码(由接口 getMap() 抽象的客户端代码)。

现在的问题是,如果我们想销毁某些地图,我们希望遍历所有地图名称并仅销毁符合特定条件的地图。由于我们不添加到 MapConfig,我们无法使用 getConfig().getMapConfigs().keyset() 来获取地图名称。

现在我们正在尝试使用 .getDistributedObjects() 进行迭代。唯一担心的是分布式对象作为一个整体加载到内存中(我希望不是..),或者只是加载到 DistributedObject 引用中的 ID 和名称(如代理)。我无法从代码中弄清楚。这样做是个好主意还是有更好的方法来获取地图对象引用。请帮忙

4

2 回答 2

5

HazelcastInstance::getDistributedObjects 只是调用所有本地已知的代理对象,但是这些都是集群已知的对象。在客户端上,这些信息是使用集群本身内部的服务器节点请求的。因此,迭代这些代理对象并测试它们的类型是安全的。

于 2016-01-14T06:47:47.643 回答
3

正如 noctarius所说getDistributedObjects()(如果我理解正确的话),迭代返回然后获取我们想要处理的相关数据应该是安全的。也许这样的事情可以完成这项工作:

import com.hazelcast.client.HazelcastClient;
import com.hazelcast.core.DistributedObject;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.core.IMap;

import java.util.Collection;

public class HazelcastMapsTest {

    public static void main(String[] args) {

        HazelcastInstance hazelcastInstance = HazelcastClient.newHazelcastClient();

        Collection<DistributedObject> distributedObjects = hazelcastInstance.getDistributedObjects();
        for (DistributedObject object : distributedObjects) {
            if (object instanceof IMap) {
                IMap map = hazelcastInstance.getMap(object.getName());
                System.out.println("Mapname=" + map.getName());
                map.entrySet().forEach(System.out::println);
            }
        }

        hazelcastInstance.shutdown();
    }

}
于 2019-05-15T18:05:42.883 回答