apache-camel - apache Camel如何从sql组件获取 header 属性

标签 apache-camel

我是 Apache Camel 的新手,我开始编写一个应用程序,从一个数据库获取数据并将其插入到另一个数据库。我正在使用 sql 组件,并试图弄清楚如何使用 spring dsl 从消息头中获取 CamelSqlUpdateCount、CamelSqlRowCount 和 CamelSqlQuery。

我知道我可以使用它来获取数据中的属性....

<log message="Processing product ${body[product_id]}"/>

但是当我像这样插入后尝试从标题中获取数据时......

<from uri="sourceSql:{{sql.selectProduct}}"/>
<log message="SELECT,${header.CamelSqlQuery},${header.CamelSqlRowCount}" loggingLevel="INFO" logName="db_log"/>
<to uri="targetSql:{{sql.insertProductOrig}}"/>     
<log message="INSERT,CONV_ORIG,${header.CamelSqlQuery},${header.CamelSqlUpdateCount}" loggingLevel="INFO" logName="db_log"/> 

它返回空。在获得有关在路由中打开跟踪以查看消息 header 中返回的内容的建议后,我可以看到这些 header 属性不存在。我正在连接到 sql server 进行选择并连接到 mysql 进行插入。有谁知道可能出了什么问题吗?

我附上了跟踪的一些示例输出...

2013-09-04,21:11:55.615,MacBook-local >>> (processProduct-route) from(sourceSql://SELECT%20TOP%205%20product_id%20FROM%20product_) --> log[SELECT,${header.CamelSqlQuery},${header.CamelSqlRowCount}] <<< Pattern:InOnly, Headers:{breadcrumbId=MacBook-local}, BodyType:org.springframework.util.LinkedCaseInsensitiveMap, Body:{product_id=273}
    2013-09-04,21:11:55.625,MacBook-local >>> (processProduct-route) log[SELECT,${header.CamelSqlQuery},${header.CamelSqlRowCount}] --> multicast <<< Pattern:InOnly, Headers:{breadcrumbId=MacBook-local}, BodyType:org.springframework.util.LinkedCaseInsensitiveMap, Body:{product_id=273}
    2013-09-04,21:11:55.644,MacBook-local >>> (processProduct-route) from(sourceSql://SELECT%20TOP%205%20product_id%20FROM%20product_) --> targetSql://insert%20into%20conv_stg_product_%20(product_id)%20values%20(:%23product_id) <<< Pattern:InOnly, Headers:{breadcrumbId=MacBook-local}, BodyType:org.springframework.util.LinkedCaseInsensitiveMap, Body:{product_id=273}
    2013-09-04,21:11:55.646,MacBook-local >>> (processProduct-route) from(sourceSql://SELECT%20TOP%205%20product_id%20FROM%20product_) --> log[INSERT,CONV_STG,${header.CamelSqlQuery},${header.CamelSqlUpdateCount}] <<< Pattern:InOnly, Headers:{breadcrumbId=MacBook}, BodyType:org.springframework.util.LinkedCaseInsensitiveMap, Body:{product_id=273}
    2013-09-04,21:11:55.642,MacBook >>> (processProduct-route) from(sourceSql://SELECT%20TOP%205%20product_id%20FROM%20product_) --> log[INSERT,CONV_ORIG,${header.CamelSqlQuery},${header.CamelSqlUpdateCount}] <<< Pattern:InOnly, Headers:{breadcrumbId=MacBook}, BodyType:org.springframework.util.LinkedCaseInsensitiveMap, Body:{product_id=273}

这是 sql 语句的样子...

sql.selectProduct=SELECT TOP 5 product_id FROM product_
sql.insertProductOrig=insert into conv_orig_product_ (product_id) values (:#product_id)

这是我的 POM 的摘录,显示我正在使用的 jdbc 驱动程序...

<!-- SQL Server database driver -->
<dependency>
    <groupId>net.sourceforge.jtds</groupId>
    <artifactId>jtds</artifactId>
    <version>1.3.0</version>
</dependency>  

<!-- MySQL database driver -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.9</version>
</dependency>

谢谢

最佳答案

这看起来像是最终用户问题。

2013-09-04,21:11:55.625,MacBook-local >>> (processProduct-route) log[SELECT,${header.CamelSqlQuery},${header.CamelSqlRowCount}] --> multicast <<< Pattern:InOnly, Headers:{breadcrumbId=MacBook-local}, BodyType:org.springframework.util.LinkedCaseInsensitiveMap, Body:{product_id=273}

跟踪日志记录的详细信息表明多播 EIP 正在使用中(见上文)。当您这样做时,多播会复制传入消息(原始消息),并且每个接收者都会获得该“原始”消息的副本。这样就可以解释为什么这些 header 不存在,因为原始副本没有 SQL 更新 header 。

因此,删除多播并仅使用直接管道。

您可以在此处阅读有关多播和管道的信息

关于apache-camel - apache Camel如何从sql组件获取 header 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18572129/

相关文章:

java - 具有并行处理功能的 Apache Camel 多播不会将异常传播到死信处理程序

java - 如何在主线程中保持 apache Camel 上下文处于 Activity 状态

java - Quartz Cron 表达式无法正常工作

java - 模拟端点期望中的 Apache Camel : usage of ValueBuilder. ConvertTo

java - Apache Camel 环境属性文件

apache-camel - 简单表达语言 : how to get the ${routeId} in Apache Camel 2. 10

java - 如何在运行时在 Spring Boot 应用程序下将添加/删除路由更新到 Apache Camel 中?

java - EJB3 在哪里适合 SOA/EIP?

java - 如何将多台机器的PATCH http请求同步到单台机器

java - Camel Spring Boot CXF 端点测试