2017-04-14 349 views
4

我正在构建一个简单的骆驼路由,它应该连续轮询表并将数据推送到ActiveMQ中。每轮投票只应该拉取之前未拉的数据。我能想到的最好的方法是跟踪最后一个成功处理的序列ID,然后选择序列ID大于前一个的项目。Apache Camel JDBC轮询和幂等性

有没有一个标准的方法来做到这一点?

回答

2

在多用户数据库中,对于具有较高id的行,可能会提交具有较低序列ID的行(当然,在Oracle & SQLServer中,我怀疑任何具有事务支持的dbms) 。在这种情况下,简单地跟踪最后处理的id可能会导致永远不会处理的行。

问题的最简单的解决方案,如果你有对模式的控制权并且是唯一处理这个表的方法,那就是在表中添加某种'已处理'列并更新该列(如@Arnaud所示) 。

如果这不是一个选项,然后有3个其他机构我考虑解决这个问题:

  1. 添加上I​​NSERT触发器到您的表中插入一个陪伴表,引用记录你的桌子,并包括一个处理过的列。更改您的查询以加入这两个表,并通过以与上述相同的方式更新随播表来将行标记为已处理。
  2. 创建伴随表并在此处插入行以标记处理过的主表中的行。您的投票查询将需要查找伴随表中不存在的行。
  3. 记录任何遗漏的序列号。在每个民意调查中明确查找。

我选择了2,因为它更容易以DBMS独立的方式实现,并且只需插入一行即可将行标记为已处理。

3

在骆驼文档的sql component,有一个属性onConsume:

“......处理每一行则可以执行此查询,如果Exchange被成功处理,例如,以纪念行作为后处理...“