2012-12-28 57 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