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