我的应用程序中有一些我无法理解的行为。我有 1 个有状态 bean,1 个无状态 bean,我想从 SLB 的 SFB 1 方法调用(WEB 页面的解析)。没关系,但是 SLB 调用业务方法将 JMS 消息发送到另一个应用程序,并且由于事务类型(必需),所有消息都同时收到。
所以我将我的 sendind 方法的事务类型更改为 REQUIRES_NEW 但它是相同的,所有消息都是同时接收的。
通过将解析方法更改为 REQUIRES_NEW,我可以异步接收消息。那么如何解释这种行为呢?
总结:
SFB method -> REQUIRED
SLB method (parsing of WEB page, urls stored in String[]) -> REQUIRED
SLB method JMS -> REQUIRED
==> JMS messages are received synchronously
SFB method -> REQUIRED
SLB method -> REQUIRED
SLB method JMS -> REQUIRES_NEW
==> JMS messages are received synchronously
SFB method -> REQUIRED
SLB method -> REQUIRES_NEW
SLB method JMS -> REQUIRES_NEW
==> JMS messages are received asynchronously
我预计情况 2 会异步发送 JMS 消息...
感谢您的澄清
奥利维尔
最佳答案
您没有显示您的代码,但我怀疑您是从同一个SLB 实例的parse 方法调用SLB 中的send 方法。在那种情况下,方法调用是直接方法调用,不经过 bean 代理,因此发送方法上的事务注释被完全忽略。
你有
SFB -> transactional proxy -> SLB -> SLB
你应该去的地方
SFB -> transactional proxy -> SLB -> transactional proxy -> SLB
最简单的方法是将send方法放在一个单独的SLB中。
关于java - 了解 EJB 事务类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12402589/