異常:
com.lambdaworks.redis.RedisException: java.lang.IllegalArgumentException: Connection to 192.168.60.59:7001 not allowed. This connection point is not known in the cluster view at com.lambdaworks.redis.cluster.PooledClusterConnectionProvider.getConnection(PooledClusterConnectionProvider.java:220) at com.lambdaworks.redis.cluster.ClusterDistributionChannelWriter.write(ClusterDistributionChannelWriter.java:85) at com.lambdaworks.redis.cluster.ClusterCommand.complete(ClusterCommand.java:38) at com.lambdaworks.redis.protocol.CommandHandler.decode(CommandHandler.java:211) at com.lambdaworks.redis.protocol.CommandHandler.channelRead(CommandHandler.java:185) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:366) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:352) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:345) at io.netty.channel.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:86) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:366) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:352) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:345) at io.netty.channel.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:86) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:366) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:352) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:345) at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1294) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:366) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:352) at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:911) at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:131) at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:572) at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:513) at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:427) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:399) at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:140) at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:144) at java.lang.Thread.run(Thread.java:748) Caused by: java.lang.IllegalArgumentException: Connection to 192.168.60.59:7001 not allowed. This connection point is not known in the cluster view at com.lambdaworks.redis.cluster.PooledClusterConnectionProvider.invalidConnectionPoint(PooledClusterConnectionProvider.java:399) at com.lambdaworks.redis.cluster.PooledClusterConnectionProvider.getConnection(PooledClusterConnectionProvider.java:209) ... 27 common frames omitted
原因:
That's a security feature of Lettuce to prevent redirects to nodes that are not (yet) known through CLUSTER NODES. The state can arise if the topology changes while your client has a different view. Lettuce loads the topology upon startup/the first cluster connection. Periodic/adaptive refresh can help or you disable validateClusterNodeMembership in ClusterClientOptions.See also https://github.com/lettuce-io/lettuce-core/wiki/Client-Options.
參考https://github.com/lettuce-io/lettuce-core/issues/731、https://groups.google.com/forum/#!msg/lettuce-redis-client-users/yks37yodyeE/zeis4aOVAgAJ
https://www.lizenghai.com/archives/42959.html
@ConditionalOnClass({ ClusterTopologyRefreshOptions.class, ClientOptions.class })
@ConditionalOnMissingBean
public LettuceClientConfigurationBuilderCustomizer lettuceClientConfigurationBuilderCustomizer(
RedisSDKProperties redisSDKProperties) {
return clientConfigurationBuilder -> {
ClusterTopologyRefreshOptions.RefreshTrigger[] refreshTriggers;
Set<ClusterTopologyRefreshOptions.RefreshTrigger> refreshTriggersArray = redisSDKProperties
.getClustertopology().getRefreshTriggers();
if (refreshTriggersArray.size() > 0) {
refreshTriggers = refreshTriggersArray
.toArray(new ClusterTopologyRefreshOptions.RefreshTrigger[refreshTriggersArray.size()]);
} else {
refreshTriggers = ClusterTopologyRefreshOptions.RefreshTrigger.values();
}
ClusterTopologyRefreshOptions clusterTopologyRefreshOptions = ClusterTopologyRefreshOptions.builder()
.enableAdaptiveRefreshTrigger(refreshTriggers)
.adaptiveRefreshTriggersTimeout(Duration
.ofMillis(redisSDKProperties.getClustertopology().getAdaptiveRefreshTriggersTimeout()))
.build();
ClientOptions clientOptions = ClusterClientOptions.builder()
.topologyRefreshOptions(clusterTopologyRefreshOptions).build();
clientConfigurationBuilder.clientOptions(clientOptions);
};
}
