ApacheCamel JDBC轮询和幂等性

ApacheCamel JDBC轮询和幂等性,jdbc,apache-camel,camel-jdbc,Jdbc,Apache Camel,Camel Jdbc,我正在构建一个简单的camel路由,它应该连续轮询一个表并将数据推送到ActiveMQ中。每次轮询应仅提取以前未提取的数据。我能想到的最好的方法是跟踪最后一个成功处理的序列id,然后选择序列id大于前一个的项目 是否有标准的方法来执行此操作?在的Camel文档中,有一个属性onConsume: “…在处理每行之后,如果交换成功,则可以执行此查询,例如将该行标记为已处理…”在多用户数据库中,序列id较低的行可以在id较高的行之后提交(当然,在Oracle和SQLServer中,我怀疑任何具有事务支

我正在构建一个简单的camel路由,它应该连续轮询一个表并将数据推送到ActiveMQ中。每次轮询应仅提取以前未提取的数据。我能想到的最好的方法是跟踪最后一个成功处理的序列id,然后选择序列id大于前一个的项目


是否有标准的方法来执行此操作?

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


“…在处理每行之后,如果交换成功,则可以执行此查询,例如将该行标记为已处理…”

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

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

如果这不是一个选项,那么我考虑了另外3种机制来解决这个问题:

  • 向表中添加一个on insert触发器,以在引用表并包含已处理列的伴随表中插入一条记录。将查询更改为联接两个表,并通过与上面相同的方式更新伴随表,将行标记为已处理
  • 创建一个伴随表并在此处插入行,以将主表中的一行标记为已处理。然后,您的轮询查询将需要查找伴随表中不存在的行
  • 跟踪任何缺失的序列ID。在每次轮询中明确查找这些ID
  • 我选择了2,因为它更容易以独立于DBMS的方式实现,并且只需要一个insert就可以将一行标记为已处理