【发布时间】:2011-08-05 19:00:03
【问题描述】:
我有一个侦听队列的 MDB。每当它收到一条消息时,它都会将执行转发到一个无状态会话 bean,它有很多逻辑、更新等。这是逻辑/调用链的流程。
队列->mdb->会话bean->会话bean->电子邮件->日志记录
最终结果是一封电子邮件和后续日志记录。
默认情况下,MDB事务由容器管理,超时时间为30秒。
但是,只要达到超时,它就会抛出超时异常并重试消息,但嵌套事务及其进程不会回滚(从会话 bean)。结果,由于重试,多封电子邮件发出,但所有日志记录都回滚(从会话 bean)除了从 MDB 本身记录的内容
是否应该从 MDB 回滚中调用所有事务,包括 mdb 日志记录,尤其是电子邮件?
会话 bean 的默认事务类型都为“必需”。
我还将 TransactionManagement 类型显式设置为 CONTAINER,并将 TransactionType 设置为 REQUIRED。电子邮件仍然出去。从会话 bean 回滚日志记录但发生重试。
然后我将 TransactionType 设置为 REQUIRES_NEW。电子邮件仍然出去。从会话 bean 回滚记录,但重试不会发生。
我应该设置什么设置来确保由 MDB 启动的整个事务以及从中调用的任何事务都回滚并发生重试?
我不想使用 bean 管理的事务,因为我希望发生失败时重试。
我的应用服务器是带有 ejb 3 规范的 weblogic 10.3。
【问题讨论】:
标签: timeout jms rollback message-driven-bean