【发布时间】:2019-07-01 11:30:48
【问题描述】:
我需要检查 Hazelcast 客户端是否连接到集群。
我正在尝试这样做的方式
ClientConfig clientConfig = new XmlClientConfigBuilder(xmlConfigurationFileName).build();
ClientStateListener clientStateListener = new ClientStateListener(clientConfig);
HazelcastInstance client = HazelcastClient.newHazelcastClient(clientConfig);
final boolean connected = clientStateListener.isConnected();
final boolean started = clientStateListener.isStarted();
isStarted 方法返回 true,但 isConnected 始终为 false。在 isConnected 检查之间,我正在从服务器集群放置和获取数据,因此客户端肯定是连接的(我也可以在日志中看到) - 同样当我将异步设置为 false (async-start="false") 然后 isConnected正在返回 true。
LifecycleServiceImpl Hazelcast 类在 fireLifecycleEvent 方法中包含(在状态改变时在 HZ 中调用)这样的代码
executor.execute(new Runnable() {
@Override
public void run() {
for (LifecycleListener lifecycleListener : lifecycleListeners.values()) {
lifecycleListener.stateChanged(lifecycleEvent);
}
}
});
在同步模式下,每次都会调用 run(两次 STARTING->STARTED 和 STARTED->CLIENT_CONNECTED)。仅异步一次(STARTING->STARTED)。
Hazelcast 版本 3.12.1。
这是整个配置(tcp-ip的服务器发现策略)
<?xml version="1.0" encoding="UTF-8"?>
<hazelcast-client xmlns="http://www.hazelcast.com/schema/client-config"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.hazelcast.com/schema/client-config
http://www.hazelcast.com/schema/client-config/hazelcast-client-config-3.12.xsd">
<group>
<name>hazelcast-group</name>
</group>
<network>
<cluster-members>
<address>XXXXXXXXXXXXXXX:XXXX</address>
<address>XXXXXXXXXXXXXXX:XXXX</address>
<address>XXXXXXXXXXXXXXX:XXXX</address>
<address>XXXXXXXXXXXXXXX:XXXX</address>
</cluster-members>
</network>
<connection-strategy async-start="true" reconnect-mode="ASYNC">
<connection-retry enabled="true">
<initial-backoff-millis>2000</initial-backoff-millis>
<max-backoff-millis>60000</max-backoff-millis>
<multiplier>3</multiplier>
<fail-on-max-backoff>false</fail-on-max-backoff>
<jitter>0.5</jitter>
</connection-retry>
</connection-strategy>
</hazelcast-client>
应该做些什么来强制 CLIENT_CONNECTED 状态的 statusChange ?
【问题讨论】:
-
为了让客户端对象处于CONNECTED状态,需要将客户端连接策略设置为
sync。否则,HazelcastInstance client = HazelcastClient.newHazelcastClient(clientConfig);将执行非阻塞,因此,给你一个尚未连接到集群的客户端对象。 -
你能分享一下日志吗?在您看到日志 CLIENT_CONNECTED 后,状态侦听器应该返回 true 到 isConnected 方法调用。确保为通常非常快的事件传递提供足够的时间(只是不要立即关闭客户端,以免状态立即更改)。您可以在客户端连接后休眠并检查侦听器状态是否已连接。
-
我可以在日志中看到CLIENT_CONNECTED信息。它已连接,因为我添加了执行程序,该执行程序已安排检查 isConnected 并尝试从集群中放置和获取数据 - 无论经过多少时间,isConnected 始终为“假”,但数据始终放置并正确获取。这只是 isConnected 方法的无效状态问题。 @Ozan Kılıç - 对不起,你错了 - 客户端已连接
-
@ishan demir - 我会和你分享日志