1

我有以下情况:(伪代码)

   CallerObject.method() {
      SessionBean1.method1(); // through remote bean interface
      // [1]
    }

    @TransactionAttribute(REQUIRED)
    SessionBean1.method1() {
      // do something...
      Event<myClass>.fire();
      // do something...
    }

    ObserverObject.method2(@Observes(during=AFTER_SUCCESS) myClass) {
      sessionBean2.method2(); // through local bean interface
    }

    @Asynchronous
    @TransactionAttribute(REQUIRED)
    SessionBean2.method2() {
      // do something...
    }

==> 会发生以下情况:

[1] 只有在 SessionBean2.method2() 中的事务完成后才能达到!(尽管 SessionBean1.method1() 中的最后一条语句是在此之前到达的。)

就好像 SessionBean1.method1() 的事务以某种方式没有“释放”(因为需要一个更好的词 - 它确实在事件处理程序 ObserverObject.method2() 被调用之前立即提交!)直到异步调用Session2.method2() 的事务也完成了。

有谁知道我怎么能避免这种情况?

(整个设置的重点是SessionBean2.method2()在 T1 完成后在后台进行长时间运行并SessionBean1.method1()尽快返回。)

PS:我已经验证过了

a) T1 立即提交(记录进入数据库)

b) SessionBean2.method2() 被异步调用(控制立即跳转到调用代码中的下一条语句)

c) SessionBean1.method1() 在 T2 完成之前不会将控制权返回给调用者代码

4

0 回答 0