0

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

4

1 回答 1

0

您的电子邮件资源不是事务性的,因此放弃 mdb 超时并让您的电子邮件发件人依赖电子邮件传输超时,此时仅调用 TX setrollback。tx 将回滚,消息将被重新发送,并且您的电子邮件可能仅在成功重试时发送。电子邮件传输超时的结果可能不确定。

于 2011-08-05T21:52:12.043 回答