Apache Camel JDBC 轮询和幂等性
Apache Camel JDBC Polling and Idempotency
我正在构建一个简单的骆驼路线,它应该持续轮询 table 并将数据推送到 ActiveMQ。每个民意调查应该只提取以前未提取的数据。我能想到的最好的方法是跟踪最后成功处理的序列 ID,然后跟踪 select 个序列 ID 大于前一个的项目。
有没有标准的方法来做到这一点?
在 sql component 的 Camel 文档中,有一个 属性 onConsume :
" ...在处理完每一行之后,如果 Exchange 处理成功,则可以执行此查询,例如将行标记为已处理..."
在多用户数据库中,序列 ID 较低的行可能会在序列 ID 较高的行之后提交(当然在 Oracle 和 SQLServer 中,我怀疑在任何具有事务支持的 dbms 中)。在这种情况下,简单地跟踪最后处理的 ID 可能会导致从未处理过的行。
问题的最简单解决方案,如果您可以控制架构并且是唯一处理此 table 的方法,那就是向 table 添加某种“已处理”列,并且更新该列(如@Arnaud 所建议的那样)。
如果这不是一个选项,那么我考虑了 3 种其他机制来解决这个问题:
- 向您的 table 添加插入触发器以在引用您的 table 并包含已处理列的伴随 table 中插入记录。更改您的查询以连接两个 table,并通过以与上述相同的方式更新伴随 table 来将行标记为已处理。
- 创建随播广告 table 并在此处插入行以将主 table 中的一行标记为已处理。然后,您的轮询查询将需要查找伴随 table.
中不存在的行
- 跟踪任何缺失的序列 ID。在每次民意调查中明确寻找那些。
我选择了 2,因为它更容易以独立于 DBMS 的方式实施,并且只需要一个插入来将行标记为已处理。
我正在构建一个简单的骆驼路线,它应该持续轮询 table 并将数据推送到 ActiveMQ。每个民意调查应该只提取以前未提取的数据。我能想到的最好的方法是跟踪最后成功处理的序列 ID,然后跟踪 select 个序列 ID 大于前一个的项目。
有没有标准的方法来做到这一点?
在 sql component 的 Camel 文档中,有一个 属性 onConsume :
" ...在处理完每一行之后,如果 Exchange 处理成功,则可以执行此查询,例如将行标记为已处理..."
在多用户数据库中,序列 ID 较低的行可能会在序列 ID 较高的行之后提交(当然在 Oracle 和 SQLServer 中,我怀疑在任何具有事务支持的 dbms 中)。在这种情况下,简单地跟踪最后处理的 ID 可能会导致从未处理过的行。
问题的最简单解决方案,如果您可以控制架构并且是唯一处理此 table 的方法,那就是向 table 添加某种“已处理”列,并且更新该列(如@Arnaud 所建议的那样)。
如果这不是一个选项,那么我考虑了 3 种其他机制来解决这个问题:
- 向您的 table 添加插入触发器以在引用您的 table 并包含已处理列的伴随 table 中插入记录。更改您的查询以连接两个 table,并通过以与上述相同的方式更新伴随 table 来将行标记为已处理。
- 创建随播广告 table 并在此处插入行以将主 table 中的一行标记为已处理。然后,您的轮询查询将需要查找伴随 table. 中不存在的行
- 跟踪任何缺失的序列 ID。在每次民意调查中明确寻找那些。
我选择了 2,因为它更容易以独立于 DBMS 的方式实施,并且只需要一个插入来将行标记为已处理。