2012-12-28 34 views
0

我刚开始使用Apache Camel,我想尝试同步两个表。两个表都有两列,分别是“id”和“name”。该方案将查询第一个表,检查第二个表中每个记录的存在,并插入不存在的每个记录。这里是我的尝试:使用Apache Camel同步两个表

<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,原来消息的时间(包含数据的一个)丢失,因为我不得不做出另一个查询在此期间(其中我检查第二个表中的数据)。我的方法很好,我如何检索包含数据的消息?

回答

3

当你调用第二个SQL查询,那么你就可以使用内容丰富的EIP将此调用的结果与原始消息“合并”。就你而言,你只需要知道是否有一行,并将其存储在标题中。

内容丰富的eip记录在这里:http://camel.apache.org/content-enricher.html,见例如丰富。

需要注意的是,您需要使用java代码并实现实现“合并”逻辑的AggregationStrategy。

您也可以按照Ben的建议将第一个数据存储在标题(或交易所属性)中,您可以稍后访问它。

虽然从EIP的角度来看这个,但它的内容丰富的EIP最能涵盖这个用例。

2

你需要保存在报头字段的第一个查询的结果,所以它不会丢失,当你设置的机构为第二查询

<header name="myresults"><simply>$body</simple></header> 
2

您也可以避免该问题,并使用某种特定于数据库的语句来执行插入操作。

对于MySQL,例如,你可以这样做

INSERT IGNORE table2 (id, name) values (#, #) 

我敢肯定,其他数据库引擎有类似的东西。它可以节省您对数据库的一些查询。

+0

这帮了我。对于Postgresql,我做了“插入......在冲突时更新集...”。 – Mustafa