Apache Camel JDBC轮询和幂等性

时间:2017-04-14 13:46:41

标签: jdbc apache-camel camel-jdbc

我正在构建一个简单的驼峰路由,它应该连续轮询表并将数据推送到ActiveMQ。每次民意调查都应该只提取之前未提取的数据我能想到的最好的方法是跟踪最后成功处理的序列ID,然后选择序列ID大于前一个的项目。

有没有一种标准方法可以做到这一点?

2 个答案:

答案 0 :(得分:3)

sql component的Camel文档中,有一个属性onConsume:

" ...处理完每行后,如果成功处理了Exchange,则可以执行此查询,例如将该行标记为已处理..."

答案 1 :(得分:2)

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

问题的最简单的解决方案,如果您可以控制模式并且是处理此表的唯一方法,那就是向表中添加某种“已处理”列并更新该列(如@Arnaud建议的那样)。

如果这不是一个选项,那么我已经考虑了另外三个解决此问题的机制:

  1. 向表中添加插入触发器,以在伴随表中插入记录,该表引用您的表并包含已处理的列。更改您的查询以加入这两个表,并通过以与上面相同的方式更新配套表,将该行标记为已处理。
  2. 创建一个伴随关系表并在此处插入行,以将主表中的行标记为已处理。然后,您的轮询查询将需要查找配套表中不存在的行。
  3. 跟踪任何丢失的序列ID。在每次民意调查中明确查找。
  4. 我选择了2,因为它更容易以独立于DBMS的方式实现,并且只需要一个插入来将行标记为已处理。