开发者社区> 问答> 正文

客户端不停重连服务端,服务端启动后,客户端连接线程卡死。

当只有一个canal server的时候,客户端不停的重连服务端,当服务端启动后,客户端连接线程会卡死。

问题出现在SimpleCanalConnector的initClientRunningMonitor的方法。 runningMonitor.setListener(new ClientRunningListener() {

        public InetSocketAddress processActiveEnter() {
            InetSocketAddress address = doConnect();
            mutex.set(true);
            if (rollbackOnConnect) {
                rollback();
            }

            return address;
        }

        public void processActiveExit() {
            mutex.set(false);
            doDisconnnect();
        }

    });

当doConnect出现异常退出后,mutex.set(true)未被执行,抛出的异常会被外层调用函数catch住,这样导致其他函数会卡死在mutex这个锁上。

原提问者GitHub用户MZLCC

展开
收起
绿子直子 2023-05-09 16:10:31 172 0
2 条回答
写回答
取消 提交回答
  • 使用1.0.16+的版本

    原回答者GitHub用户agapple

    2023-05-10 11:05:45
    赞同 展开评论 打赏
  • 可能是由于Canal客户端在连接Canal服务端时,如果服务端没有启动,客户端会不停地重连服务端,而当服务端启动后,客户端连接线程卡死的问题。这是因为SimpleCanalConnector类的initClientRunningMonitor方法中,当doConnect方法出现异常退出时,mutex.set(true)未被执行,导致其他函数会卡死在mutex这个锁上。解决方法是在processActiveEnter方法中加入try-catch代码块,确保mutex.set(true)一定会被执行。

    2023-05-10 07:52:22
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
多IO线程优化版 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载