2014-07-22 73 views
0

我有幾個關於EJB事務的問題。我有一種情況,一個進程已經變得更長時間運行了,而且由於超出了服務器超時而有時會失敗。雖然我最初增加了超時(包括總事務和最大事務),但對於長時間運行的流程,我知道將這項工作儘可能分割成更小的工作單元是非常有意義的, 。因此,我正在根據以下背景和隨後的問題尋找關於下一步行動的一些想法或參考。重新設計POJO到EJB或客戶端事務

環境: EJB 3.1,JPA 2.0中,WebSphere 8.5

背景: 我建了一個組POJO做一些面向批處理工作的企業應用程序。它們是非EJB POJO,旨在實現多個業務流程(5個相關的順序流程,每個流程都依賴於它的前身)。 POJO使用普通的Java項目,而不是EJB項目。

但是,這些POJO通過JPA訪問EJB Facade以訪問數據庫。 5個業務流程的抽象核心執行EJB Facade的JNDI查找,以返回域對象進行處理。最初,設計是完全從服務器運行,但是,需要引發外部這些進程。因此,我創建了一個EJB包裝程序,以便進程可以遠程調用(單獨或作爲基於常用策略接口的單個​​進程)。不幸的是,數據的大小,包括行寬和行數都大大超出了原來的意圖。

完成這些批處理所需的處理時間已經顯着增加(從幾個小時到大約1/2天,並且可能會增加)。 5個進程中只有一個對多線程有意義(我確實多線程實現了它)。因爲我有包裝器EJB來啓動1或全部,所以我決定爲每個進程創建一個新的容器事務,而不是作爲單個進程運行所有「單個默認事務」時的「必需」。由於一個進程是多線程的,因此嘗試爲每個線程創建一個新的事務是有意義的,然而,作爲一組POJO,我沒有事務處理能力。

問題: 所以我的問題是,什麼更有意義,爲什麼?將POJO重新設計爲EJB本身,並讓包裝EJB將每個進程實例化爲子進程,其中每個進程都可以擁有自己的事務,更重要的是,多線程進程可以爲每個線程創建一個事務。或者,嘗試從容器中的JNDI查找中嘗試在POJO中創建UserTransaction並嘗試將其作爲bean管理的事務進行管理(如果這是一個可行的解決方案),會更有意義。我知道這可能與應用程序有關,但對於Java EE容器的超時而言,有什麼合理之處?顯然,我不想逃跑進程,但想確保我可以完成這些批處理。

不幸的是,這個應用程序已經被部署爲一個生產系統。重新設計,儘管它可能不過是將策略邏輯組裝在EJB中,但對功能的重大改變。

我在這裏和通過一般的互聯網搜索找了一些其他的線程,但我想我會看到如果任何人有完全的另一個或另一個解決方案的引人注目的論據。討論像這樣的話題的其他鏈接是值得讚賞的。我摔跤是否發佈這個,因爲有些人可能把這個看作是主觀的,但是,我認爲這個狹窄的話題值得這個職位,並且可能與嘗試這樣的流程的其他人相關。

+0

Arjan,謝謝你糾正我的大寫和標點符號。我會盡量記住,這些標題和標點對於這些帖子很重要。我猜想我的壞習慣。 – jrsdev

回答

0

因爲我真的沒有得到一大堆響應或思考這個問題在過去的幾個星期中,我想我會回答這個問題,如果他們遇到這種或類似的情況,希望能幫助其他人作出決定。

最終,我將其中一個POJO重新設計爲一個EJB,作爲一個包裝調用其他POJO。包裝EJB執行的操作與它僅僅是一個POJO時相同,除了事實上我在主方法上添加了事務語義(REQUIRES_NEW)。主要方法基於狀態模式調用其他POJO,以便每個調用(或POJO)都獲得自己的事務。調用主方法的EJB中的其他方法使用NOT_SUPPORTED定義,以便我可以將每次調用的事務分隔到主方法,而不加入現有事務。

完全公開,原來的事務語義添加大大增加了處理時間(大約幾天),但是由於超過事務超時而沒有失敗。這是JPA多對一關係帶來的一些意想不到的問題的結果,這些關係帶來了太多的數據。數據因多對一關係而被收回。正如我最初提到的,我的一些數據行寬度意外增加。該數據增加位於相關表格對象中,但查詢當時不需要該數據。我通過更改查詢(爲SELECT NEW查詢創建對象,將關係更改爲FetchType.LAZY等)來糾正這些問題。展望未來,如果我能夠投入足夠的時間,我會將這些POJO的其餘部分轉換爲EJB。執行最重要的線程工作的POJO已通過通過ExecutorService運行的Callable實現實現。如果我可以改造那個,那麼這個計劃就是讓每個線程都成爲自己的交易。但是,雖然我還不確定,但由於狀態更新的原因,我看到我的容器可能已經爲每個線程組(10個線程)創建事務。我將不得不做更多的調查。

0

這不是直接回答你的問題,而是你可以考慮的事情。
WebSphere 8.5特別爲這類應用程序(批處理)提供了一個批處理容器。批處理功能適用於必須與交易應用程序一起執行批處理作業的應用程序。批處理工作可能需要幾小時甚至幾天才能完成,並在運行時使用大量內存或處理能力。您可以在批處理應用程序中重用Java類,批處理步驟可以在羣集中並行運行,並具有事務檢查點管理。

在以下資源看看:

IBM Education Assistant - Batch applications
Getting started with the batch environment

+0

謝謝。我知道批處理容器存在於WAS中,但對此並不瞭解,至今尚未使用。我一直在使用它,因爲我不認爲它是可移植的,但也許它不一定是。感謝您的參考,我簡要地看了一下。我相信對於長時間運行的流程來說,這將會有所幫助,但是需要進行一些重新設計,我不確定我現在可以解決什麼問題(製作新的EAR等)。我可以從我的應用程序中獲取現有的JAR,創建批量EAR應用程序並運行?或者我將不得不分開功能? – jrsdev