开发者社区 问答 正文

canal 客户端在捕获异常时需要执行connector.rollback()

环境信息

canal version = 1.1.4 mysql version = 5.7

问题描述

在使用canal时,我一直在遭受数据丢失的痛苦。我发现数据丢失总是会出现一些异常情况(比如连接问题)。

所以我在AbstractCanalClientTest.java中检查了客户端代码

在第79行中,得到了//连接器.回滚(batchId);//处理失败, 回滚数据

我认为如果我们在出现异常时添加connector.rerollback(batchId)会很好。

例如

while (running) { Message message = connector.getWithoutAck(batchSize); // 获取指定数量的数据 long batchId = message.getId(); try { int size = message.getEntries().size(); if (batchId == -1 || size == 0) { // 无效信息,可以考虑休眠 } else { printSummary(message, batchId, size); printEntry(message.getEntries()); if (handleEntry != null) { handleEntry.invoke(message.getEntries()); } }

    if (batchId != -1) {
        connector.ack(batchId); // 提交确认
    }
} catch (Exception e) {
    try {
        Thread.sleep(1000L);
    } catch (InterruptedException e1) {
        Thread.currentThread().interrupt();
    }
    if (batchId != -1) {
        connector.rollback(batchId); // 处理失败, 回滚数据
    }
}

}

原提问者GitHub用户hxy91819

展开
收起
Java工程师 2023-05-03 10:17:01 111 分享 版权
1 条回答
写回答
取消 提交回答
  • 默认rollbackOnConnect=true,会在下一轮自动rollback,不过代码的确是可以优化一下

    原回答者GitHub用户agapple

    2023-05-04 14:24:41
    赞同 展开评论