2011-07-08 26 views
2

關於EJB的問題:事務超時EJB對線程的影響

假設我有一個會話bean,它有一個無限循環。它在EJB事務下運行。現在當EJB的事務超時時,會導致無限循環線程中斷或容器將停止運行無限循環的線程。

回答

5

現在,當EJB超時的事務,會導致無限循環線程中斷或容器將停止運行infinte循環的線程。

這個答案是基於我執行了幾年前在OC4J 10.3.x中時,WebSphere 6.x中和WebLogic 10.x的,並可能適用於其他容器以類似的方式反向工程。至於我記得,事務超時檢測是在不同的容器不同的方式實現,但它們都採用規定某些共同原則如下:

  • 事務超時檢測通常是在由容器管理不同的線程執行。相關線程會休眠指定的時間(通常爲1秒),然後喚醒並遍歷所有正在進行的事務。如果任何事務超出了指定的超時時間(通常在各種級別 - JTA容器,EJB等),那麼線程將標記事務進行回滾。不會嘗試向執行事務的線程發出有關事務狀態的信號。
  • 當執行事務的線程嘗試與JTA協調器或事務資源(XAResource實例)進行交互以執行一些工作(例如,發出SQL查詢)時,容器將確定該事務具有被標記爲回滾,並且會拋出TransactionRolledBackException

根據以上所述,可以推斷,除非拋出TransactionRolledBackException,否則無限循環將永不會被破壞。換句話說,只有在循環內嘗試事務性活動時,循環纔會被破壞;如果沒有這樣的活動被執行,那麼循環將保留它的屬性來無限地執行。

請注意,WebLogic等特定容器允許檢測「卡住」線程。這意味着這樣的容器能夠檢測線程是否在配置的持續時間之外延長了一段時間。這並不意味着當容器檢測到卡住時容器將終止或中斷該線程。

1

不,一般來說容器不可能自動檢測到無限循環。某些應用程序服務器可能會檢測到事務已超時或EJB已長時間處於活動狀態。