2014-10-07 89 views
3

我有兩個系統,稱它們爲A和B. 當A,A中的某些重要對象更改通過Apache Camel發送給B時。 但是,我遇到了一種情況,當A實際上有對象的更改日誌,而B必須只反映對象的實際狀態。 此外,A中的更改日誌可以包含「將來」記錄。這意味着,對象的狀態改變將在未來的某個時刻進行。 系統A的用戶​​可以編輯此更改日誌,刪除更改記錄,添加帶有任何時間戳記(過去和未來)的新更改記錄,甚至更新現有更改。 當然,A將這些更改記錄發送給B,但B只需要對象的實際狀態。在Apache Camel中將更改日誌轉換爲實際狀態

請注意,我可以從A查詢對象,但A是性能關鍵系統,因此我不會查詢某些內容,因爲它可能會導致額外的負載。 此外,從A查詢數據的API過於複雜,我希望儘可能避免使用它。

我可以在這裏看到兩個問題。 首先是實現更改日誌記錄中的特定更改是否可能導致更改實際狀態。 我打算將更改日誌存儲在中間數據庫中。 隨着更改日誌記錄的到來,我將在中間數據庫中添加/刪除/更新它,然後計算對象的實際狀態並將此狀態發送給B.

其次是跟蹤更改計劃。 除了在固定的時間間隔內運行定期作業(比如15分鐘),我無法發明任何東西。 此作業將掃描從上次調用到當前調用的時間間隔內的所有記錄。

我喜歡Apache Camel for是基於組件的方法,當您只需要連接端點並獲得所有工作,只需少量編碼即可。 在Apache Camel和EIP中,這個問題是否有預先存在的原語?

+0

你說API查詢來自A的數據過於複雜。你打算如何從A獲取數據? A有沒有推送機制?你打算直接訪問A的倉庫嗎?你打算修改A嗎?如果是這樣,爲什麼不添加更好的API來查詢緩存機制來保護性能? – Sergey 2014-10-10 07:00:09

+0

當A檢測到某個實體發生了變化時,它會將其序列化爲XML並將其寫入文件系統中的文件中。我使用以下消費者:'<從uri =「ftp://路徑到目錄」>'。另外,A有一個推送所有數據的機制,我將用它來初始加載數據。我沒有A的代碼,我也不能影響它的查詢API,也不能緩存緩存。此外,這也是一個政策問題:如果我能證明這輛公交車不會影響A的性能,那麼說服A的車主更容易接受集成巴士。 – 2014-10-10 07:10:40

+1

你的情況不是微不足道的,我不相信你可以找到任何銀彈解決方案。最接近的組件AFAIK是http://camel.apache.org/cache.html。如果不適合,您可以隨時使用基於數據庫的解決方案,使用Camel提供的所有額外服務,例如交易,監控等 – Sergey 2014-10-10 08:13:39

回答

0

其實我的工作在一個非常類似的用例,其中系統A發送快照和發送到系統B.

首先需要之前翻譯的更新,你需要觸發機制,給你的系統A的初始狀態(「快照」),timer:組件可以啓動一次性啓動邏輯。

現在,您將收到快照數據(您未指定方式,可能是ftp文件或jms端點)。正如Sergey在他的評論中所暗示的那樣,驗證數據,將其分解爲項目,並將每項數據存儲在本地內存cache:中,並將其唯一鍵入。使用符合邏輯的過期策略(例如48小時)。

從那裏,不斷處理來自ftp:端點的「更新」數據。對於每次更新,您需要將更新與cache:中的數據進行匹配,並確定需要將什麼(以及何時)發送到系統B.

需要稍後發送到系統B的數據將需要堅持在內存或數據庫中。

最後,您需要一個調度機制來確定每15分鐘是否應發送新數據,因此您可以輕鬆使用timer:quartz:

總之,您可以從以下組件構建這種融合:timercacheftpquartz加上一些自定義bean /處理器執行定製邏輯。

主要的挑戰是處理緩存的數據,然後進行更新,並找出控制機制,以便在初始連接,斷開連接或重新啓動駱駝應用程序時發生什麼。

祝你好運;)