2017-09-14 165 views
0

我正在處理採購訂單的應用程序。
此應用程序構建於EJB1上並在IBM Websphere上運行。
我有一個需要解決的場景/問題。EJB 2中的Ashiving Singleton功能會話Bean

有一個Stateless Session Bean其中處理大量的訂單(通常訂單數量約爲5K)。我想讓這個功能同步。
即,如果其中一個用戶激活訂單處理,則在第一次處理完成之前,沒有其他用戶應該能夠發起該過程。

由於一些限制,我無法將其升級到EJB3。
有沒有任何有效的方法來解決這個問題?
我希望在任何提供的解決方案需要更少的代碼改變以及..

回答

1

答案真的取決於其中存在的訂單/他們是如何存儲,以及有多少併發運行的服務器實例也許能夠啓動順序處理。

如果訂單僅存在於內存中(看起來不太可能)或者只有一個應用程序服務器進程正在運行以執行此功能,那麼您可以爲無狀態會話Bean類添加一個靜態字段並對其進行同步。這將提供類似於EJB 3.x單例bean的功能。但是,如果同一應用程序在多個應用程序服務器實例上同時運行,那麼即使是單例bean也不適合您,因爲每個服務器仍有一個實例,因此跨進程間沒有同步。在這種情況下,您確實需要讓無狀態bean獲得存儲訂單的鎖。例如,如果您的訂單存儲在DB2數據庫的行中,那麼您可以僅使用一行將另一個表添加到同一個數據庫,並且無狀態bean需要獲得該行的行鎖才能處理訂單。這提供了跨進程的同步(假定所有應用程序服務器實例正在訪問相同的共享數據庫)。

+0

否不存在多個服務器實例。只有一個。關於訂單,它們將作爲未處理的訂單存儲在數據庫中。管理員用戶將每天或幾天批量處理它們。處理實際上將記錄從一個表移動到另一個表。但是單擊一個調用EJB方法的按鈕。它有點耗時的過程,可能需要3-4分鐘。我想避免的是另一個管理員用戶啓動流程,而一個啓動的流程將持續進行。 –

+0

所以,像向無狀態bean添加一個靜態字段,然後在該方法中對其進行同步那樣簡單的事情應該能夠做到。 'private static final Object syncObj = new Object();' – Tracy

相關問題