环境信息
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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
默认rollbackOnConnect=true,会在下一轮自动rollback,不过代码的确是可以优化一下
原回答者GitHub用户agapple