我有一个监听队列的MDB。当它收到一条消息时,它会将执行转发给一个无状态的会话bean,该bean有很多逻辑、更新等。
队列->mdb->会话bean->会话bean->电子邮件->日志记录
最终结果是一封电子邮件和随后的日志记录。
默认情况下,MDB事务由容器管理,超时时间为30秒。
但是,无论何时达到超时,它都会抛出超时异常并重试消息,但嵌套的事务及其进程不会回滚(从会话bean)。因此,由于重试,会发出多封电子邮件,但除了从MDB本身记录的内容之外,所有日志记录都会回滚(从会话bean)
是否应该从MDB回滚调用所有事务,包括mdb日志记录,尤其是电子邮件?
会话bean的默认事务类型都是'required‘。
我还根据需要将TransactionManagement类型显式地设置为带有TransactionType的容器。电子邮件仍然会发送出去。会话beans的日志记录会回滚,但会重试。
然后,我将TransactionType设置为REQUIRES_NEW。电子邮件仍然会发送出去。从会话beans回滚日志,但不会重试。
我应该使用什么设置来确保由MDB启动的整个事务以及从中调用的所有事务都能回滚并重试?
我不想使用bean管理的事务,因为我希望在失败时重试。
我的应用服务器是带有EJB3规范的WebLogic10.3。
发布于 2011-08-06 05:52:12
您的电子邮件资源不是事务性的,因此请丢弃mdb超时,让您的电子邮件发件人依赖电子邮件传输超时,在这一点上,只需调用TX setrollback。tx将回滚,邮件将重新传递,您的电子邮件可能仅在重试成功时发送。电子邮件传输超时的结果可能不是确定性的。
https://stackoverflow.com/questions/6961330
复制相似问题