我正在构建一个简单的骆驼路线,它应该不断地轮询一个表并将数据推送到 ActiveMQ 中。每个轮询应该只提取以前未提取的数据。我能想到的最好方法是跟踪最后成功处理的序列 id,然后选择序列 id 大于前一个的项目。
有没有标准的方法来做到这一点?
我正在构建一个简单的骆驼路线,它应该不断地轮询一个表并将数据推送到 ActiveMQ 中。每个轮询应该只提取以前未提取的数据。我能想到的最好方法是跟踪最后成功处理的序列 id,然后选择序列 id 大于前一个的项目。
有没有标准的方法来做到这一点?
在sql 组件的 Camel 文档中,有一个属性 onConsume :
“...处理完每一行后,如果 Exchange 处理成功,则可以执行此查询,例如将该行标记为已处理...”
在多用户数据库中,序列 ID 较低的行可能会在 ID 较高的行之后提交(当然在 Oracle 和 SQLServer 中,我怀疑在任何支持事务的 dbms 中)。在这种情况下,简单地跟踪最后处理的 id 可能会导致永远不会处理的行。
该问题的最简单解决方案,如果您可以控制架构并且是唯一处理此表的方法,则将某种“已处理”列添加到表中并更新该列(如@Arnaud 建议的那样)。
如果这不是一个选项,那么我考虑了 3 种其他机制来解决这个问题:
我选择了 2,因为它更容易以独立于 DBMS 的方式实现,并且只需要一个插入来将一行标记为已处理。