java - 了解 EJB 事务类型

标签 java transactions ejb

我的应用程序中有一些我无法理解的行为。我有 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/

相关文章:

java - Grails 3.2 文件上传错误 (FileNotFoundException )

python - PonyORM (Python) "Value was updated outside of current transaction"但事实并非如此

java - servlet 中的 EJB 注入(inject)失败

java - WAS 7.0.0.23 - MDB 中带有激活规范的默认拦截器会抛出 classcastException

java - 使用Gson反序列化另一个对象内的对象数组

java.lang.ArrayIndexOutOfBoundsException : length=10; index=10 异常

java - 我必须同步 socket.send 吗?

android - FragmentTransaction 中的 fragment 重复

mysql - 我什么时候应该在查询中使用事务?

java - 与 EJB 的远程连接在本地主机上工作,但在 127.0.0.1 和另一台服务器上失败