【发布时间】:2010-11-03 13:43:02
【问题描述】:
有没有人有关于如何实现自己的 XAResource 的好教程或一些建议?我需要 Spring 的 MailSender 是事务性的,这样邮件只会在事务提交后发送,而且似乎没有任何现有的事务性包装器。
【问题讨论】:
标签: java spring email transactions xa
有没有人有关于如何实现自己的 XAResource 的好教程或一些建议?我需要 Spring 的 MailSender 是事务性的,这样邮件只会在事务提交后发送,而且似乎没有任何现有的事务性包装器。
【问题讨论】:
标签: java spring email transactions xa
如果您只需要等待提交,正如您在评论中所说,您可以使用TransactionSynchronizationManager.registerSynchronization() 触发提交时发送电子邮件。
【讨论】:
您可以将TransactionSynchronizationManager.registerSynchronization(如gpeche提到的)与TransactionSynchronizationAdapter 结合使用,TransactionSynchronizationAdapter 具有在当前事务的不同阶段调用的各种方法。我认为最适合这个问题的方法是afterCommit。
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
@Override
public void afterCommit() {
super.afterCommit();
sendEmail();
}
});
【讨论】:
我怀疑是否有可能为 SMTP 实现真正的 XAResource。资源管理器(在这种情况下为 SMTP 服务器)应该有事务支持,我不相信有。我想说你最好的选择是“最后一次资源提交”模式——它允许一个非 XA 资源参与 XA 事务。搜索谷歌,有很多信息。大多数 Java EE 服务器都支持这一点。
【讨论】:
gpeche 提到的选项旁边的另一个选项是从事务中发送事务 JMS 消息。然后让消息监听器(例如 MDB bean)发送电子邮件。
EJB 中的另一个技巧是在事务中调度计时器。计时器也是事务性的,只有在事务提交时才会启动。只需使用 timeout = 0 的计时器,它会在事务提交后立即启动。
【讨论】: