2012-12-10 133 views
0

我有兩個豆子:FirstBeanSecondBean休眠:長CMT交易

FirstBean有方法方法1與REQUIRED事務屬性,SecondBean有方法方法2與NOT_SUPPORTED事務屬性。方法1調用方法2。

@Stateless 
class FirstBean implement IFirstBean 
{ 
    ISecondBean secondBean; 

    @TransactionAttribute(TransactionAttributeType.REQUIRED) 
    void method1() 
    { 
     //... 
     secondBean.method2() 
     //... 
    } 
} 

@Stateless 
class SecondBean implement ISecondBean 
{ 
    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) 
    void method2() 
    { 
     //.... 
    } 
} 

它運作良好。
但當方法2工作了很長一段時間(多則4-5分鐘),我得到在JBoss 4服務器

Caused by: java.lang.IllegalStateException: [com.arjuna.ats.internal.jta.transaction.arjunacore.inactive] [com.arjuna.ats.internal.jta.transaction.arjunacore.inactive] The transaction is not active! 
    at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1379) 
    at com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.commit(BaseTransaction.java:135) 

和異常接下來在WebLogic 10.3

Caused By: org.hibernate.SessionException: Session is closed! 
    at org.hibernate.impl.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:49) 
    at org.hibernate.impl.SessionImpl.clear(SessionImpl.java:253) 

方法一結束,例外的是拋出後

回答

0

我用下一個施工中的結尾。

@Stateless 
class FirstBean implement IFirstBean 
{ 
    ISecondBean secondBean; 

    @TransactionAttribute(TransactionAttributeType.REQUIRED) 
    void firstPartOfmethod1() 
    { 
     //... 
    } 
    @TransactionAttribute(TransactionAttributeType.REQUIRED) 
    void secondPartOfmethod1() 
    { 
     //... 
    } 
} 

@Stateless 
class SecondBean implement ISecondBean 
{ 
    @TransactionAttribute(TransactionAttributeType.NEVER) 
    void method2() 
    { 
     //.... 
    } 
} 
@Stateless 
class MainBean implement ISecondBean 
{ 
    @TransactionAttribute(TransactionAttributeType.NEVER) 
    void mainMethod() 
    { 
     firstBean.firstPartOfMethod1(); 
     secondBean.method2(); 
     firstBean.secondPartOfMethod1(); 
     //.... 
    } 
} 
在這種情況下`方法1
0

老實說,我會推遲任何交易工作,直到所有的非交易任務完成。通過創建一個非事務「包裝」的方法很容易做到:

class FirstBean implements IFirstBean { 
    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) 
    public void overlordMethod() { 
     secondBean.method2(); 
     method1(); 
    } 
} 

這可防止通過將根據需要一個方法導致問題不需要交易的長時間運行的方法。現在,完成一個方法的五分鐘是很多,但假設在運行時沒有改進,並且由於某種原因您無法重新排序您的方法調用,那麼您總是可以增加事務超時爲您的JTA。閱讀here,瞭解在JBoss 4上執行此操作的各種方法。

+0

()'會'TransactionAttributeType.NOT_SUPPORTED'也 – Ilya

+0

不,你真正想要活躍在'方法一交易()'。使用'TransactionAttributeType.REQUIRED'會導致方法參與一個事務,如果它存在,或者另外開始一個新事務。 – Perception

+0

http://www.javahelp.info/2009/11/01/using-transactionattribute-in-submethods-on-same-ejb3-beans/ – Ilya

0

在使用JTA事務的JBoss 4.x中,缺省超時時間爲5分鐘。當「方法1」被調用時,由於執行「方法2」時「方法1」的事務已被暫停,因此經過的時間正在增加,所以很有可能超過正在進行的事務的超時。您可以通過將超時時間增加到非常大的值來確認 - JBoss has a TransactionTimeout attribute that you can annotate "method 1" with

One non-obvious thing to remember is that when a transaction is suspended, it doesn't mean that the transactional timer is stopped.