首页 > 解决方案 > 重新启动客户端在 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

标签: javahazelcasthazelcast-imap

解决方案


对我来说,以下工作按预期工作(没有错误)。你的有什么不同?

服务器 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();
    }


推荐阅读