我有一个侦听队列的 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。