我刚刚开始使用Apache Camel,我想尝试同步两个表。两个表都有两列,“id”和“name”。该场景将查询第一个表,检查第二个表中是否存在每个记录,并插入不存在的每个记录。这是我的尝试:
<camel:camelContext id="test">
<camel:route>
<camel:from uri="timer://kickoff?period=5s"/>
<camel:to uri="sql:select id, name from table1?dataSourceRef=dataSource"/>
<camel:split>
<camel:simple>body</camel:simple>
<camel:to uri="sql:select * from table2 where id = #?dataSourceRef=dataSource" />
<camel:choice>
<camel:when>
<camel:simple>${header.CamelSqlRowCount} == 0</camel:simple>
<camel:to uri="sql:insert into table2 (id, name) values (#, #)?dataSourceRef=dataSource" />
</camel:when>
</camel:choice>
<camel:to uri="mock:result" />
</camel:split>
</camel:route>
</camel:camelContext>
这里的问题是,当我到达insert into table2
时,原始消息(包含数据的消息)将丢失,因为我必须在此期间进行另一个查询(我在其中检查数据)第二表)。我的方法是否良好,如何检索包含数据的消息?
答案 0 :(得分:3)
当您调用第二个SQL进行检查时,您可以使用内容丰富的EIP将此调用的结果与原始消息“合并”。在您的情况下,您只需要知道是否有一行,并将其存储在标题中。
内容丰富的eip记录在此处:http://camel.apache.org/content-enricher.html,例如参见“充实”。
需要注意的是,您需要使用java代码并实现实现“合并”逻辑的AggregationStrategy。
您也可以像Ben建议的那样将第一个数据存储在标题(或交换中的属性)中,稍后您可以访问它。
虽然从EIP的角度来看这一点,但它的内容更丰富,最能涵盖这个用例的EIP。
答案 1 :(得分:2)
您需要在标题字段中保留第一个查询的结果,以便在为第二个查询设置正文时不丢失
<header name="myresults"><simply>$body</simple></header>
答案 2 :(得分:2)
您还可以避免此问题并使用某种特定于数据库的语句来执行插入操作。
对于mysql,您可以执行类似
的操作INSERT IGNORE table2 (id, name) values (#, #)
我确信其他数据库引擎也有类似的东西。它可以为您节省一些数据库查询。