0

我有两个 bean:FirstBeanSecondBean

FirstBean有方法method1和 REQUIRED 事务属性,SecondBean有方法method2和 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()
   {
      //....
   }
}   

它运作良好。
但是当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

老实说,我会推迟任何事务性工作,直到所有非事务性任务完成。通过创建非事务性“包装器”方法轻松完成:

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

这可以防止不需要事务的长时间运行的方法导致需要事务的方法出现问题。现在,完成一个方法需要 5 分钟但假设在运行时没有需要改进,并且由于某种原因您无法重新排序方法调用,那么您总是可以增加 JTA 的事务超时。阅读此处了解在 JBoss 4 上执行此操作的各种方法。

于 2012-12-10T15:27:35.023 回答
0

在使用 JTA 事务的 JBoss 4.x 中,默认超时为 5 分钟。当调用“方法 1”时,您很可能会超过正在进行的事务的超时时间,因为在执行“方法 2”时“方法 1”的事务已暂停,而经过的时间正在增加。您可以通过将超时增加到一个非常大的值来确认这一点 - JBoss 有一个 TransactionTimeout 属性,您可以使用.

要记住的一件不明显的事情是,当事务暂停时,并不意味着事务计时器停止。

于 2012-12-13T05:19:52.763 回答
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();
      //....
   }
} 
于 2012-12-24T17:27:01.233 回答