开发者社区> 问答> 正文

SimpleCanalConnector在竞争的时候会抛should connect first的E

Repro:

使用default-instance模式(有Zookeeper支持)的Canal Server; Setup第一个ClusterCanalClient,调用connect的时候,成功连接; Setup第二个ClusterCanalClient,调用connect的时候,会抛Exception: com.alibaba.otter.canal.protocol.exception.CanalClientException: should connect first at com.alibaba.otter.canal.client.impl.SimpleCanalConnector.waitClientRunning(SimpleCanalConnector.java:418) at com.alibaba.otter.canal.client.impl.SimpleCanalConnector.subscribe(SimpleCanalConnector.java:186) at com.alibaba.otter.canal.client.impl.ClusterCanalConnector.subscribe(ClusterCanalConnector.java:100) Expected: 第二个ClusterCanalClient在connect的时候应该被block住,直至其它的client disconnect。

推测原因(见下面的gist修改)

https://gist.github.com/caojia/10960073/revisions

原提问者GitHub用户caojia

展开
收起
绿子直子 2023-05-09 16:10:32 107 0
2 条回答
写回答
取消 提交回答
  • 你的理解是对的,估计修改另一个bug考虑不全,代码我做了下修改,多谢

    原回答者GitHub用户agapple

    2023-05-10 11:05:52
    赞同 展开评论 打赏
  • 随心分享,欢迎友善交流讨论:)

    根据您提供的信息,可以推测SimpleCanalConnector在连接时会先检查是否已经连接到Canal Server,如果没有连接则会抛出"should connect first"的异常。在多个ClusterCanalClient同时连接时,可能存在竞争的情况,导致第二个ClusterCanalClient在连接前没有等待第一个连接完成,从而抛出异常。

    可以通过在SimpleCanalConnector中添加同步锁或使用并发控制机制来解决这个问题,确保每个ClusterCanalClient都可以顺利连接Canal Server。同时,也可以在ClusterCanalClient中进行优化,确保每个连接都等待前一个连接完成后再进行连接。

    2023-05-09 17:48:17
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载