有没有人有一个很好的教程或一些关于如何实现自己的 XAResource 的建议?我需要 Spring 的 MailSender 是事务性的,这样邮件只会在事务提交后发送,而且似乎没有任何现有的事务性包装器。
4 回答
如果您只需要等待提交,正如您在评论中所说,您可以调查使用TransactionSynchronizationManager.registerSynchronization()
触发提交时发送电子邮件。
您可以将 a TransactionSynchronizationManager.registerSynchronization
(如提到的gpeche)与 a 一起使用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 的计时器,因此它将在事务提交后立即启动。