Apache Camel多SQL查询时CamelSqlRowCount未更新如何重置
Apache Camel SQL端点CamelSqlRowCount头不更新问题解决方案
问题根因
Apache Camel的SQL组件默认仅当查询返回非空结果集时,才会更新CamelSqlRowCount请求头。如果执行的SQL返回空结果集,组件不会覆盖已存在的同名头,因此上一次SQL执行产生的CamelSqlRowCount值会被保留,和你测试的现象完全匹配。
解决方案
方案1:手动清理旧头(兼容所有Camel版本)
每次执行SQL语句前,主动移除上一次产生的CamelSqlRowCount头即可,修改后的路由示例如下:
@Component public class TestSQLRowCount extends RouteBuilder { @Override public void configure() throws Exception { from("timer://testsql?fixedRate=true&period=5000") // 第一次执行SQL前清空历史头 .removeHeader("CamelSqlRowCount") .to("sql:select 1 from dual_seq?dataSource=#dataSource&outputHeader=TEST_ROW_COUNT&outputType=SelectOne") .log("OLD_AUDIT_DATA ${headers.TEST_ROW_COUNT} - ROW_COUNT ${headers.CamelSqlRowCount}") // 第二次执行SQL前再次清空旧头 .removeHeader("CamelSqlRowCount") .to("sql:select 1 from dual_seq where 0 = 1?dataSource=#dataSource&outputHeader=TEST_ROW_COUNT2&outputType=SelectOne") .log("OLD_AUDIT_DATA ${headers.TEST_ROW_COUNT2} - ROW_COUNT ${headers.CamelSqlRowCount}") .end(); } }
如果需要同时清理所有SQL组件产生的历史头,可以用.removeHeaders("CamelSql*")批量清除所有前缀为CamelSql的头,避免其他历史参数干扰后续执行逻辑。
方案2:开启端点自动重置头(Camel 3.10+版本支持)
在SQL端点参数中添加resetHeaders=true,组件会在执行当前SQL前自动重置所有SQL相关的请求头,无需手动编写清理逻辑,示例端点配置如下:
sql:select 1 from dual_seq?dataSource=#dataSource&outputHeader=TEST_ROW_COUNT&outputType=SelectOne&resetHeaders=true
两种方案都可以保证每次拿到的CamelSqlRowCount都是当前SQL执行的真实结果。
内容的提问来源于stack exchange,提问作者Bart
相关产品推荐
相关产品推荐

