Hazelcast重启后如何安全地恢复客户端的缓存操作?

时间:2018-01-03 08:47:26

标签: caching spring-boot hazelcast

每当我重新启动hazelcast服务器时,无需在spring boot中重新启动客户端。我收到了以下错误:

    03-01-2018 16:44:17.966 [http-nio-8080-exec-7] ERROR  o.a.c.c.C.[.[.[.[dispatcherServlet].log - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.hazelcast.client.HazelcastClientNotActiveException: Partition does not have owner. partitionId : 203] with root cause
java.io.IOException: Partition does not have owner. partitionId : 203
    at com.hazelcast.client.spi.impl.ClientSmartInvocationServiceImpl.invokeOnPartitionOwner(ClientSmartInvocationServiceImpl.java:43)
    at com.hazelcast.client.spi.impl.ClientInvocation.invokeOnSelection(ClientInvocation.java:142)
    at com.hazelcast.client.spi.impl.ClientInvocation.invoke(ClientInvocation.java:122)
    at com.hazelcast.client.spi.ClientProxy.invokeOnPartition(ClientProxy.java:152)
    at com.hazelcast.client.spi.ClientProxy.invoke(ClientProxy.java:147)
    at com.hazelcast.client.proxy.ClientMapProxy.getInternal(ClientMapProxy.java:245)
    at com.hazelcast.client.proxy.ClientMapProxy.get(ClientMapProxy.java:240)
    at com.hazelcast.spring.cache.HazelcastCache.lookup(HazelcastCache.java:139)
    at com.hazelcast.spring.cache.HazelcastCache.get(HazelcastCache.java:57)
    at org.springframework.cache.interceptor.AbstractCacheInvoker.doGet(AbstractCacheInvoker.java:71)

如果我启用了热重启,问题就解决了。但有没有办法恢复客户端应用程序而不重新启动它并禁用热重启?

1 个答案:

答案 0 :(得分:1)

如果连接断开,Hazelcast客户端会尝试重新连接到群集。它使用ClientNetworkConfig.connectionAttemptLimitClientNetworkConfig.connectionAttemptPeriod元素来配置尝试的频率。 connectionAttemptLimit定义断开连接的尝试次数,connectionAttemptPeriod定义两次重试之间的时间间隔(ms)。请参阅下面的用法示例:

ClientConfig clientConfig = new ClientConfig();
clientConfig.getNetworkConfig().setConnectionAttemptLimit(5);
clientConfig.getNetworkConfig().setConnectionAttemptPeriod(5000);

从Hazelcast 3.9开始,您可以使用reconnect-mode属性来配置客户端在断开连接后重新连接到群集的方式。它有三个选项:

  • 选项OFF禁用重新连接。
  • ON以阻塞方式启用重新连接,其中所有等待的调用都将被阻止,直到群集连接建立或失败。
  • 选项ASYNC以非阻塞方式启用重新连接,其中所有等待的调用都将收到HazelcastClientOfflineException

其默认值为ON。您可以在下面看到配置示例:

ClientConfig clientConfig = new ClientConfig();
clientConfig.getConnectionStrategyConfig()
        .setReconnectMode(ClientConnectionStrategyConfig.ReconnectMode.ON);

通过使用这些配置元素,您可以在不重新启动的情况下恢复客户端。