如何从java客户端检查hazelcast集群是否处于活动状态?

如何从java客户端检查hazelcast集群是否处于活动状态?,java,client-server,hazelcast,Java,Client Server,Hazelcast,我们在客户机-服务器模式下使用hazelcast。hazelcast集群包含2个hazelcast节点,我们有大约25个客户端连接到集群 我现在寻找的是一个简单的检查,试图找出集群是否仍然存在。这应该是一个相当便宜的操作,因为这种检查将在每个客户机上非常频繁地发生(我可以想象每秒钟一次) 最好的方法是什么 最简单的方法是将LifecycleListener注册到客户端HazelcastInstance: HazelcastInstance client = HazelcastClient

我们在客户机-服务器模式下使用hazelcast。hazelcast集群包含2个hazelcast节点,我们有大约25个客户端连接到集群

我现在寻找的是一个简单的检查,试图找出集群是否仍然存在。这应该是一个相当便宜的操作,因为这种检查将在每个客户机上非常频繁地发生(我可以想象每秒钟一次)


最好的方法是什么

最简单的方法是将LifecycleListener注册到客户端HazelcastInstance:

    HazelcastInstance client = HazelcastClient.newHazelcastClient();
    client.getLifecycleService().addLifecycleListener(new LifecycleListener() {
        @Override
        public void stateChanged(LifecycleEvent event) {

        }
    })

客户端使用周期性心跳来检测集群是否仍在运行

您也可以使用
LifecycleService.isRunning()
方法:

HazelcastInstance hzInstance = HazelcastClient.newHazelcastClient();
hzInstance.getLifecycleService().isRunning()

我找到了一种更可靠的方法来检查hazelcast的可用性,因为

client.getLifecycleService().isRunning()
如前所述,使用异步重新连接模式时,始终返回true

@Slf4j
public class DistributedCacheServiceImpl implements DistributedCacheService {

    private HazelcastInstance client;

    @Autowired
    protected ConfigLoader<ServersConfig> serversConfigLoader;

    @PostConstruct
    private void initHazelcastClient() {
        ClientConfig config = new ClientConfig();
        if (isCacheEnabled()) {
            ServersConfig.Hazelсast hazelcastConfig = getWidgetCacheSettings().getHazelcast();
            config.getGroupConfig().setName(hazelcastConfig.getName());
            config.getGroupConfig().setPassword(hazelcastConfig.getPassword());
            for (String address : hazelcastConfig.getAddresses()) {
                config.getNetworkConfig().addAddress(address);
            }

            config.getConnectionStrategyConfig()
                  .setAsyncStart(true)
                  .setReconnectMode(ClientConnectionStrategyConfig.ReconnectMode.ASYNC);

            config.getNetworkConfig()
                  .setConnectionAttemptLimit(0) // infinite (Integer.MAX_VALUE) attempts to reconnect
                  .setConnectionTimeout(5000);

            client = HazelcastClient.newHazelcastClient(config);
        }
    }

    @Override
    public boolean isCacheEnabled() {
        ServersConfig.WidgetCache widgetCache = getWidgetCacheSettings();
        return widgetCache != null && widgetCache.getEnabled();
    }

    @Override
    public boolean isCacheAlive() {
        boolean aliveResult = false;
        if (isCacheEnabled() && client != null) {
            try {
                IMap<Object, Object> defaultMap = client.getMap("default");
                if (defaultMap != null) {
                    defaultMap.size(); // will throw Hazelcast exception if cluster is down
                    aliveResult = true;
                }
            } catch (Exception e) {
                log.error("Connection to hazelcast cluster is lost. Reason : {}", e.getMessage());
            }
        }
        return aliveResult;
    }
}
@Slf4j
公共类DistributedCacheServiceImpl实现DistributedCacheService{
私有Hazelcast实例客户端;
@自动连线
受保护的ConfigLoader服务器ConfigLoader;
@施工后
私有void initHazelcastClient(){
ClientConfig=newclientconfig();
如果(isCacheEnabled()){
ServersConfig.HazelСast hazelcastConfig=getWidgetCacheSettings().getHazelcast();
config.getGroupConfig().setName(hazelcastConfig.getName());
config.getGroupConfig().setPassword(hazelcastConfig.getPassword());
for(字符串地址:hazelcastConfig.getAddresses()){
config.getNetworkConfig().addAddress(地址);
}
config.getConnectionStrategyConfig()
.setAsyncStart(真)
.setReconnectMode(客户端连接策略配置.ReconnectMode.ASYNC);
config.getNetworkConfig()
.SetConnectionAtterLimit(0)//无限(整数.MAX_值)尝试重新连接
.setConnectionTimeout(5000);
client=HazelcastClient.newHazelcastClient(配置);
}
}
@凌驾
公共布尔值isCacheEnabled(){
ServersConfig.WidgetCache-WidgetCache=getWidgetCacheSettings();
返回widgetCache!=null&&widgetCache.getEnabled();
}
@凌驾
公共布尔值isCacheAlive(){
布尔aliveResult=false;
if(isCacheEnabled()&&client!=null){
试一试{
IMap defaultMap=client.getMap(“默认”);
if(defaultMap!=null){
defaultMap.size();//如果集群关闭,将引发Hazelcast异常
aliveResult=true;
}
}捕获(例外e){
错误(“与hazelcast群集的连接丢失。原因:{}”,e.getMessage());
}
}
返回aliveResult;
}
}
作为
isRunning()
,我选择以下方法(和的混合)。这不需要事件侦听器,这在我的设置中是一个优势:

if (!hazelcastInstance.getLifecycleService().isRunning()) {
  return Health.down().build();
}

int parameterCount;
LocalTopicStats topicStats;
try {
  parameterCount = hazelcastInstance.getMap("parameters").size();
  topicStats = hazelcastInstance.getTopic("myTopic").getLocalTopicStats();
} catch (Exception e) {
  // instance may run but cluster is down:
  Health.Builder builder = Health.down();
  builder.withDetail("Error", e.getMessage());
  return builder.build();
}

Health.Builder builder = Health.up();
builder.withDetail("parameterCount", parameterCount);
builder.withDetail("receivedMsgs", topicStats.getReceiveOperationCount());
builder.withDetail("publishedMsgs", topicStats.getPublishOperationCount());
return builder.build();

很抱歉反应太晚!我注册了一个监听器,在我杀死集群后几乎立即收到了通知,所以它基本上起作用了。不过我只收到了两个事件,客户端已连接,客户端已断开。我是否还必须处理其他事件,或者这些事件不应该在客户端进行评估?发现在未连接的客户端上调用此事件(意味着集群中没有节点,客户端重复记录
无法获得活动的集群连接
)返回true。