2014-01-29 18 views
5

所以,我有一個Web客戶端和一個EJB定時器,單獨部署。如何協調部署到WebLogic集羣中的多個服務器的單個ejb計時器?

工作流程如下:

1)用戶訪問客戶端。 2)用戶請求發生已知長時間運行的操作,因此我們將請求運行到數據庫表中。 3)TimerOne每隔幾秒檢查一次該表以查看是否有任何等待任務,以便找到用戶的請求並運行任務。

我的問題是,在我們的應用程序運行的某些環境中,我們正在利用服務器集羣。當我們這樣做時,客戶端和EJB定時器都被部署到集羣中的每個服務器上。

可以將客戶端部署到多個服務器,因爲它有助於工作負載;但是,使計時器在多個服務器上運行是個問題。當用戶請求運行長時間運行的任務時,兩個定時器同時從數據庫中獲取任務並開始運行。由於長時間運行的作業通常會寫入數據庫,因此這種情況會導致衝突等問題。

我的目標是能夠將EJB定時器部署到兩臺服務器上,但是在羣集中可以維護一些狀態,定時器可以使用這些狀態來決定是否應該選擇任務,或者如果其他實例已經撿起來了。

我試過使用數據庫和試用文件存儲,但是這些要麼太慢,要麼我不能拿出防彈工作流的同步。

有誰知道處理這個問題的好方法嗎?它甚至有可能嗎?

該解決方案應該能夠在羣集WebLogic域,非羣集WebLogic域,羣集Glassfish域和非羣集Glassfish域中運行。

如果還有另一種更優雅的解決方案,我願意改變這種方式。

感謝您的任何想法!

回答

3
0

我願意改變這種方式,如果還有另一種更優雅的解決方案。

我知道你的問題是關於EJB計時器,而是採取記住以下幾點: 在我看來,您有需要異步處理的優勢條件。

在早期的Java EE版本,一種備選方案來實現這種要求是使用JMS,它允許您發送稍後處理的業務層組件的消息。其他的可能性是你所描述的那個,它需要使用EJB Timer。我認爲這兩種情況都是一種解決方案,填補了EE規範中的空白。

由於Java EE 6,你可以定義asynchronous services它允許你進行異步調用,避免使用的功能被認爲用於其他目的。