2012-12-11 52 views
2

我們正在開發一個應用程序,它需要處理以多行存儲在數據庫中的大文件。處理可以跨多個JMS客戶端分割,以便每個客戶端都可以獲得自己的共享,並獨立完成處理。如何確定所有的JMS客戶端是否完成了他們的部分?一旦所有JMS客戶端完成任務,我們需要在處理流程中觸發另一個步驟。我們使用MDB作爲JMS客戶端。使用JMS的主工模式

Infact我們正在收集數據庫上的個人任務狀態。但是沒有這樣的主人。流程看起來像這樣。

  1. 系統的一部分接收文件塊並保存在數據庫中。

  2. 下一步將該文件邏輯分割成N個分區,並將分區的元數據作爲JMS消息發送。

  3. 然後JMS客戶端處理它們的文件的一部分,當它們完成後,它們將在數據庫中的另一個表上更新任務的狀態。

但是怎麼可能觸發下一步呢?一個JMS客戶端如何知道所有其他客戶端已完成其部件。或者我怎麼能在這裏聘請一個主人?

回答

1

您可以在應用程序級別執行此操作。每個工作人員在完成任務時應該創建通知。您可以將通知推送到特殊的JMS隊列或將其存儲在數據庫中。這取決於你的應用程序。通知應該包含創建我的經理創建任務的任務ID。所以其他組件(或管理器)可以檢查所有創建的任務是否已經終止。

+0

感謝您的回答。我們有一張表來存儲個人客戶端任務狀態。但誰可以協調個人客戶的任務?我已經更新了這個問題。 – nobody

1

使用Blackboard體系結構模式將部分解決方案註冊到所有子流程可能會很有用。看看這article,或谷歌它的更多信息。

1

我會讓JMS客戶端儘可能快地處理數據。例如,創建一個名爲FooDataSourceRequest的隊列,這是客戶端可以發佈消息來請求某些數據的位置,然後有另一個名爲FoodDataSourceResponse的隊列,其中放置了包含數據的響應消息。

您可以使用jms回覆隊列或相關ID來讓數據使用者獲取其數據。這樣你可以讓一個JMS生產者負責跟蹤下一個要處理的塊。

有趣的部分是跟蹤哪些chunck被處理,哪些不是,您可能需要使用分佈式transacation將數據放入隊列並更新數據庫等等。

1

這個DZone published article概述瞭如何使用JGroups來實現一個類似的模型。作者的意圖是展示使用JGroups比JMS實現更多的好處,但作爲一般模式,它很好地記錄下來,所以你可能會覺得它很有用。