开发者社区> 问答> 正文

使用内嵌canal的方法启动canal,zk地址错误的情况下,调用CanalServerWithEm

环境信息

canal version canal-1.1.2 mysql version

问题描述

使用内嵌canal的方法启动canal 使用zk存储meta信息如果 zk地址错误的情况下,调用 canalServer.stop(destination); canalServer.stop();

步骤重现

提问249.png

现在执行情况

otter也有类型的问题,不能关闭zk连接

给了一个错误的zk地址。然后执行 canalServer.stop(destination); canalServer.stop(); zk的报错仍在继续就是上面的截图。一直报错connection refused。定位到最下面是zk的超时默认好像是240天。

原提问者GitHub用户zhouluoyang0406

展开
收起
古拉古拉 2023-05-08 14:25:59 122 0
3 条回答
写回答
取消 提交回答
  • canalServer里的stop没有去关闭zk,如果用的是otter,zk链接是不会去关闭的

    原回答者GitHub用户agapple

    2023-05-09 17:59:32
    赞同 展开评论 打赏
  • 根据你提供的信息,看起来是因为错误的zk地址导致连接失败,而zk连接失败后,canalServer无法正常关闭。建议你先修改zk地址,确保canalServer正常启动并连接到zk,然后再执行停止操作。另外,你可以尝试手动关闭zk连接,具体方法可以参考以下代码:

    if (canalServer != null) {
        canalServer.stop(destination);
        canalServer.stop();
    }
    if (zkClientx != null) {
        zkClientx.close();
    }
    

    其中,zkClientx是你创建zk连接的变量名。这样可以确保关闭zk连接,避免长时间超时。

    2023-05-08 15:39:45
    赞同 展开评论 打赏
  • 随心分享,欢迎友善交流讨论:)

    当你使用内嵌canal的方式启动Canal时,如果zk地址错误,CanalServerWithEmbedded会抛出ConnectException,但是并不会自动关闭zk连接。因此,在关闭CanalServer之前,需要手动关闭zk连接,否则会导致zk连接泄漏。你可以在catch块中添加关闭zk连接的代码,例如:

    CanalServerWithEmbedded canalServer = ...; CanalInstance instance = new CanalInstance(...); String destination = instance.getDestination(); try { canalServer.start(); canalServer.start(destination); // do something... } catch (Exception e) { // handle exception... } finally { canalServer.stop(destination); canalServer.stop(); canalServer.getCanalMQStarter().stopRunning(); canalServer.getCanalInstanceManager().stop(); canalServer.getCanalMQStarter().stop(); canalServer.getZkClient().close(); } 这样,在CanalServer停止之前,会先关闭zk连接,避免连接泄漏。另外,关于zk的超时时间,默认是10秒,而不是240天。你可以通过Canal的配置文件进行配置,例如:

    canal.instance.zookeeper.sessionTimeout=10000 这里的sessionTimeout表示zk session的超时时间,单位是毫秒。如果你使用的是内嵌canal,你可以在CanalInstance的构造函数中指定zookeeper的配置,例如:

    CanalInstance instance = new CanalInstance(...); instance.setZkClusters("127.0.0.1:2181"); instance.setSessionTimeout(10000); 这样,就可以指定zk session的超时时间为10秒。

    2023-05-08 15:24:00
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

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