2017-04-14 66 views
4

我正在構建一個簡單的駱駝路由,它應該連續輪詢表並將數據推送到ActiveMQ中。每輪投票只應該拉取之前未拉的數據。我能想到的最好的方法是跟蹤最後一個成功處理的序列ID,然後選擇序列ID大於前一個的項目。Apache Camel JDBC輪詢和冪等性

有沒有一個標準的方法來做到這一點?

回答

2

在多用戶數據庫中,對於具有較高id的行,可能會提交具有較低序列ID的行(當然,在Oracle & SQLServer中,我懷疑任何具有事務支持的dbms) 。在這種情況下,簡單地跟蹤最後處理的id可能會導致永遠不會處理的行。

問題的最簡單的解決方案,如果你有對模式的控制權並且是唯一處理這個表的方法,那就是在表中添加某種'已處理'列並更新該列(如@Arnaud所示) 。

如果這不是一個選項,然後有3個其他機構我考慮解決這個問題:

  1. 添加上I​​NSERT觸發器到您的表中插入一個陪伴表,引用記錄你的桌子,幷包括一個處理過的列。更改您的查詢以加入這兩個表,並通過以與上述相同的方式更新隨播表來將行標記爲已處理。
  2. 創建伴隨表並在此處插入行以標記處理過的主表中的行。您的投票查詢將需要查找伴隨表中不存在的行。
  3. 記錄任何遺漏的序列號。在每個民意調查中明確查找。

我選擇了2,因爲它更容易以DBMS獨立的方式實現,並且只需插入一行即可將行標記爲已處理。

3

在駱駝文檔的sql component,有一個屬性onConsume:

「......處理每一行則可以執行此查詢,如果Exchange被成功處理,例如,以紀念行作爲後處理...「