问题
项目使用docker部署后,运行一段时间后访问系统会出现redis连接不可用的问题
gateway_1 | 2022-03-24 05:36:34,257 WARN [ForkJoinPool.commonPool-worker-4] Exception thrown during asynchronous load
gateway_1 | java.util.concurrent.CompletionException: io.lettuce.core.RedisCommandTimeoutException: Command timed out after 2 second(s)
gateway_1 | at java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:273) ~[?:1.8.0_322]
gateway_1 | at java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:280) [?:1.8.0_322]
gateway_1 | at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1606) [?:1.8.0_322]
gateway_1 | at java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:1596) [?:1.8.0_322]
gateway_1 | at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289) [?:1.8.0_322]
gateway_1 | at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056) [?:1.8.0_322]
gateway_1 | at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692) [?:1.8.0_322]
gateway_1 | at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:175) [?:1.8.0_322]
gateway_1 | Caused by: io.lettuce.core.RedisCommandTimeoutException: Command timed out after 2 second(s)
提示连接超时,在本地开发的时候是不会存在这个问题的。
链接池中出现断链接原因
- 1、Lettuce 自适应拓扑刷新(Adaptive updates)与定时拓扑刷新(Periodic updates) 是默认关闭的。
- 2、项目用了k8s做docker容器化部署,但是k8s有设置空闲连接超时就断开,所以当你从连接池拿到被断开的连接时就会报错。
处理
@PostConstruct
public void task() {
new ScheduledThreadPoolExecutor(1, new NamedThreadFactory("redis-ping")).scheduleAtFixedRate(() -> sync.ping(), 15, 120, TimeUnit.SECONDS);
}