You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 05:24:00