【问题标题】:MDB transaction does not rollback email on timeoutMDB 事务在超时时不回滚电子邮件
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 我不明白你在说什么。我的问题是,无论是 MDB 超时还是在发送电子邮件后引发的任何其他异常,事务更新(例如记录到 db 表)都会回滚,但电子邮件仍然会消失。在这种情况下,在邮件传输上设置超时如何防止电子邮件发送出去?
    • 在传输上设置超时可以让您保持数据库和实际电子邮件同步发送的最佳可能性。 MDB 超时对电子邮件发送没有影响,因此请消除它。当传输超时时,电子邮件可能没有发送出去,所以回滚 TX。如果您从电子邮件传输中获得握手,那么电子邮件肯定会到达 SMTP 服务器,因此请提交 TX。一旦您调用电子邮件发送,几乎没有确定性的方法可以确定它是否真的发送出去(发生异常时)。
    • 尼古拉斯,你是对的。据我所知,没有办法通过 JavaMail API 方法阻止邮件在成功发送后发出。我认为有一些方法可以通过 XA 资源管理器来处理这个问题,这样一旦提交发生,邮件就会被发送出去,但那里没有运气。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2019-03-30
    • 2015-11-25
    • 2019-03-15
    • 1970-01-01
    • 1970-01-01
    • 2014-06-26
    • 2022-06-11
    • 2011-03-05
    相关资源
    最近更新 更多