0

FirstBeanSecondBeanの 2 つの Bean があります。

FirstBeanにはREQUIRED トランザクション属性を持つメソッド method1 があり、SecondBeanNOT_SUPPORTED トランザクション属性を持つメソッドmethod2があります。method1 は method2 を呼び出します。

@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()
   {
      //....
   }
}   

そしてそれはうまくいきます。
しかし、method2が長時間(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)  

method1 が終了し、例外がスローされます

4

3 に答える 3

0

JTAトランザクションを使用するJBoss4.xでは、デフォルトのタイムアウトは5分です。「メソッド2」の実行中に「メソッド1」のトランザクションが一時停止されている間に経過時間が増加しているため、「メソッド1」が呼び出されたときに、進行中のトランザクションのタイムアウトを超えている可能性があります。これは、タイムアウトを非常に大きな値に増やすことで確認できます。JBossには、「メソッド1」に注釈を付けることができるTransactionTimeout属性があります

覚えておくべき自明ではないことの1つは、トランザクションが一時停止されても、トランザクションタイマーが停止することを意味するわけではないということです。

于 2012-12-13T05:19:52.763 に答える
0

正直に言うと、すべての非トランザクション タスクが完了するまで、トランザクション作業を延期します。非トランザクションの「ラッパー」メソッドを作成することで簡単に実行できます。

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

これにより、トランザクションを必要としない長時間実行されるメソッドが、トランザクションを必要とするメソッドで問題を引き起こすことを防ぎます。現在、メソッドが完了するのに 5 分はかかりますが、実行時に改善する必要がなく、何らかの理由でメソッド呼び出しの順序を変更できないと仮定すると、いつでも JTA のトランザクション タイムアウトを増やすことができます。JBoss 4 でこれを行うさまざまな方法については、こちらを参照してください。

于 2012-12-10T15:27:35.023 に答える