如何让Spring Integration JDBC入站通道适配器轮询新数据?
解决方案
你的问题核心是当前JDBC入站适配器没有跟踪已处理记录,无法识别新增数据,同时需要限制在工作日运行。以下是具体修改方案:
1. 实现增量读取(解决新增记录无法拾取的问题)
有两种常用方式实现增量读取,可根据你的表结构选择:
方式一:基于时间戳跟踪(无需修改表结构)
如果Trade表存在记录创建/更新时间字段(如created_time),可以通过时间戳过滤新增数据,适配器会自动维护上次查询的时间戳:
<int-jdbc:inbound-channel-adapter id="jdbcInbound" channel="channel" data-source="dataSource" query="SELECT * FROM Trade WHERE created_time > :lastPollTime ORDER BY created_time" row-mapper="TradeRowMapper" max-rows-per-poll="100" track-last-updated="true"> <int:poller cron="0 * * * * MON-FRI"/> </int-jdbc:inbound-channel-adapter>
关键修改:
- 修改
query为带:lastPollTime参数的增量查询,仅读取上次poll之后新增的记录 - 开启
track-last-updated="true",让适配器自动维护并填充lastPollTime参数
方式二:基于状态标记(需修改表结构)
如果需要明确标记已处理的记录,可以给Trade表添加一个processed字段(BOOLEAN类型,默认值false),读取后将记录标记为已处理:
<int-jdbc:inbound-channel-adapter id="jdbcInbound" channel="channel" data-source="dataSource" query="SELECT * FROM Trade WHERE processed = false" update="UPDATE Trade SET processed = true WHERE id IN (:id)" row-mapper="TradeRowMapper" max-rows-per-poll="100"> <int:poller cron="0 * * * * MON-FRI"/> </int-jdbc:inbound-channel-adapter>
关键修改:
query仅读取未处理的记录- 添加
update属性,读取完成后将对应记录标记为已处理(:id会自动填充查询结果中的主键值)
2. 限制工作日运行(替换固定延迟调度)
将原fixed-delay的poller改为cron表达式,限制仅在周一至周五每分钟执行一次(和原配置的60秒间隔一致):
cron="0 * * * * MON-FRI"表示:每分钟第0秒执行,仅周一到周五生效
注意事项
- 时间戳方式需确保
created_time字段在记录插入时正确赋值,且字段类型为TIMESTAMP/DATETIME - 状态标记方式需确保
id是Trade表的主键或唯一标识,保证update语句能准确匹配已读取记录
内容的提问来源于stack exchange,提问作者Krishan
相关产品推荐
相关产品推荐

