java - 重新启动客户端在 Hazelcast 中出现异常
问题描述
我有一个 Hazelcast 服务器和 Hazelcast 客户端,但是当我关闭客户端并重新启动客户端时,它给了我以下错误:
Exception during initial connection to [localhost]:5701: com.hazelcast.core.HazelcastException: java.net.SocketException: Address already in use: no further information to address localhost/127.0.0.1:5701
我的服务器代码如下:
@Bean
public HazelcastInstance hazelcastInstance() {
try {
Config config = new Config();
config.getNetworkConfig().setPort(5701)
.setPortAutoIncrement( true ).setPortCount(10);
config.setClusterName("abc");
config.setInstanceName("abc");
MapConfig mapConfig = new MapConfig();
mapConfig.setName("abc");
config.addMapConfig(mapConfig);
hazelCastInstance = Hazelcast.newHazelcastInstance(config);
return hazelCastInstance;
}catch (Exception e) {
e.printStackTrace();
return null;
}
}
我的客户代码如下:
ClientConfig clientConfig = new ClientConfig();
clientConfig.setClusterName("abc");
clientConfig.getNetworkConfig().addAddress("localhost");
clientConfig.getNetworkConfig().setSmartRouting(true);
clientConfig.getNetworkConfig().addOutboundPortDefinition("5701-5720");
ClientConnectionStrategyConfig connectionStrategyConfig = clientConfig.getConnectionStrategyConfig();
ConnectionRetryConfig connectionRetryConfig = connectionStrategyConfig.getConnectionRetryConfig();
connectionRetryConfig.setInitialBackoffMillis(1000)
.setMaxBackoffMillis(60000)
.setMultiplier(2)
.setClusterConnectTimeoutMillis(1000)
.setJitter(0.2);
HazelcastClient hc = HazelcastClient.newHazelcastClient(clientConfig);
在关闭客户端时,我正在调用hc.shutdown()。但是当重新启动客户端时,它给了我上面的错误。请帮我解决这个问题。
在我得到的日志下面:
java.net.SocketException: Address already in use: no further information
to address localhost/127.0.0.1:5701
18-Jun-2021 13:13:16.811 INFO [localhost-startStop-1] com.hazelcast.client.impl.connection.ClientConnectionManager.null hz.client_1 [APP] [4.2] Trying to connect to [localhost]:5703
18-Jun-2021 13:14:16.908 WARNING [localhost-startStop-1] com.hazelcast.client.impl.connection.tcp.TcpClientConnection.null hz.client_1 [APP] [4.2] ClientConnection{alive=false, connectionId=1, channel=NioChannel{/127.0.0.1:5703->localhost/127.0.0.1:5703}, remoteAddress=null, lastReadTime=2021-06-18 13:13:16.897, lastWriteTime=2021-06-18 13:13:16.896, closedTime=2021-06-18 13:14:16.905, connected server version=null} closed. Reason: Failed to authenticate connection
java.util.concurrent.TimeoutException
at com.hazelcast.client.impl.spi.impl.ClientInvocationFuture.newTimeoutException(ClientInvocationFuture.java:63)
at com.hazelcast.spi.impl.AbstractInvocationFuture.get(AbstractInvocationFuture.java:656)
at com.hazelcast.client.impl.connection.tcp.TcpClientConnectionManager.authenticateOnCluster(TcpClientConnectionManager.java:857)
at com.hazelcast.client.impl.connection.tcp.TcpClientConnectionManager.getOrConnectToAddress(TcpClientConnectionManager.java:594)
at com.hazelcast.client.impl.connection.tcp.TcpClientConnectionManager.lambda$doConnectToCandidateCluster$3(TcpClientConnectionManager.java:490)
at com.hazelcast.client.impl.connection.tcp.TcpClientConnectionManager.connect(TcpClientConnectionManager.java:444)
at com.hazelcast.client.impl.connection.tcp.TcpClientConnectionManager.doConnectToCandidateCluster(TcpClientConnectionManager.java:490)
at com.hazelcast.client.impl.connection.tcp.TcpClientConnectionManager.doConnectToCluster(TcpClientConnectionManager.java:406)
at com.hazelcast.client.impl.connection.tcp.TcpClientConnectionManager.connectToCluster(TcpClientConnectionManager.java:367)
at com.hazelcast.client.impl.connection.tcp.TcpClientConnectionManager.start(TcpClientConnectionManager.java:316)
at com.hazelcast.client.impl.clientside.HazelcastClientInstanceImpl.start(HazelcastClientInstanceImpl.java:369)
at com.hazelcast.client.HazelcastClient.constructHazelcastClient(HazelcastClient.java:460)
at com.hazelcast.client.HazelcastClient.newHazelcastClientInternal(HazelcastClient.java:416)
at com.hazelcast.client.HazelcastClient.newHazelcastClient(HazelcastClient.java:136)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1706)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1645)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:305)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:301)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:196)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:446)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:328)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4699)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5165)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:743)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:719)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:705)
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1125)
at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1859)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
18-Jun-2021 13:14:16.927 WARNING [localhost-startStop-1] com.hazelcast.client.impl.connection.ClientConnectionManager.null hz.client_1 [APP] [4.2] Exception during initial connection to [localhost]:5703: com.hazelcast.core.HazelcastException: java.util.concurrent.TimeoutException
18-Jun-2021 13:14:16.944 INFO [localhost-startStop-1] com.hazelcast.client.impl.connection.ClientConnectionManager.null hz.client_1 [APP] [4.2] Trying to connect to [localhost]:5702
18-Jun-2021 13:14:18.991 WARNING [localhost-startStop-1] com.hazelcast.client.impl.connection.ClientConnectionManager.null hz.client_1 [APP] [4.2] Exception during initial connection to [localhost]:5702: com.hazelcast.core.HazelcastException: java.net.SocketException: Connection refused: no further information to address localhost/127.0.0.1:5702
18-Jun-2021 13:14:18.993 WARNING [localhost-startStop-1] com.hazelcast.client.impl.connection.ClientConnectionManager.null hz.client_1 [APP] [4.2] Unable to get live cluster connection, cluster connect timeout (1000 ms) is reached. Attempt 1.
18-Jun-2021 13:14:18.999 INFO [localhost-startStop-1] com.hazelcast.client.impl.connection.ClientConnectionManager.null hz.client_1 [APP] [4.2] Unable to connect to any address from the cluster with name: APP. The following addresses were tried: [[localhost]:5702, [localhost]:5703, [localhost]:5701]
18-Jun-2021 13:14:19.008 INFO [localhost-startStop-1] com.hazelcast.core.LifecycleService.null hz.client_1 [APP] [4.2] HazelcastClient 4.2 (20210324 - 405cfd1) is SHUTTING_DOWN
18-Jun-2021 13:14:19.024 INFO [localhost-startStop-1] com.hazelcast.core.LifecycleService.null hz.client_1 [APP] [4.2] HazelcastClient 4.2 (20210324 - 405cfd1) is SHUTDOWN
解决方案
对我来说,以下工作按预期工作(没有错误)。你的有什么不同?
服务器 1 启动并获取端口 5701。客户端 1 启动并获取端口 5702。客户端 1 停止。客户端 2 启动并获取端口 5703。客户端 2 停止。服务器 2 停止。
对我来说,当客户端 1 关闭时,端口 5702 处于TIME_WAIT
状态几秒钟,因此客户端 2 获得下一个可用端口(5703)。
public static void main(String[] args) throws Exception {
Config config = new Config();
config.getNetworkConfig().setPort(5701)
.setPortAutoIncrement( true ).setPortCount(10);
config.setClusterName("abc");
HazelcastInstance server = Hazelcast.newHazelcastInstance(config);
System.out.println("SERVER UP");
TimeUnit.SECONDS.sleep(5L);
ClientConfig clientConfig = new ClientConfig();
clientConfig.setClusterName("abc");
clientConfig.getNetworkConfig().addAddress("localhost");
clientConfig.getNetworkConfig().setSmartRouting(true);
clientConfig.getNetworkConfig().addOutboundPortDefinition("5701-5720");
ClientConnectionStrategyConfig connectionStrategyConfig = clientConfig.getConnectionStrategyConfig();
ConnectionRetryConfig connectionRetryConfig = connectionStrategyConfig.getConnectionRetryConfig();
connectionRetryConfig.setInitialBackoffMillis(1000)
.setMaxBackoffMillis(60000)
.setMultiplier(2)
.setClusterConnectTimeoutMillis(1000)
.setJitter(0.2);
HazelcastInstance client1 = HazelcastClient.newHazelcastClient(clientConfig);
System.out.println("CLIENT 1 UP");
TimeUnit.SECONDS.sleep(5L);
client1.shutdown();
System.out.println("CLIENT 1 DOWN");
TimeUnit.SECONDS.sleep(5L);
HazelcastInstance client2 = HazelcastClient.newHazelcastClient(clientConfig);
System.out.println("CLIENT 2 UP");
TimeUnit.SECONDS.sleep(5L);
client2.shutdown();
System.out.println("CLIENT 2 DOWN");
TimeUnit.SECONDS.sleep(5L);
TimeUnit.MINUTES.sleep(1L);
server.shutdown();
}
推荐阅读
- python - 从最大“深度”不一致的结构化数据中提取的最 Pythonic 方式是什么?
- python - 重塑 Pandas Dataframe 中的多级索引和列
- javascript - 如何让 Onkey 函数将输入文本字段的值复制到其他 3 个文本字段
- javascript - 如何使用 javascript 从 json 获取日期格式的最近日期值?
- c# - EF Core:可以添加和保存父实体,但根本无法保存子实体
- reactjs - 使用 HackerNews API 对 API 的请求进行分页
- html - 为什么 span 标签在 ap 标签的内容前加了一个大空格?
- javascript - 如何在 socket.io 中使用 socks 5 代理
- corda - Corda 节点资源管理器是否与令牌一起使用?
- php - 使用 php MySQL 和 HTML 进行登录检查