有没有人有关于如何实现自己的XAResource的好教程或一些建议?我需要Spring的MailSender是事务性的,因此只有在事务提交后才会发送邮件,而且似乎没有任何现有的事务包装器。
答案 0 :(得分:2)
如果您只是需要等待提交,正如您在评论中所说,您可以使用TransactionSynchronizationManager.registerSynchronization()
进行调查,以便在提交时触发电子邮件发送。
答案 1 :(得分:2)
您可以使用TransactionSynchronizationManager.registerSynchronization
(如提及的 gpeche )和TransactionSynchronizationAdapter
,其中包含在当前事务的各个阶段调用的各种方法。我认为最合适的方法是afterCommit。
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
@Override
public void afterCommit() {
super.afterCommit();
sendEmail();
}
});
答案 2 :(得分:1)
我怀疑是否可以为SMTP实现真正的XAResource。资源管理器(在这种情况下是SMTP服务器)应该有事务支持,我不相信有任何支持。我想说你最好的选择是'上次资源提交'模式 - 它允许一个非XA资源参与XA事务。搜索Google,有很多信息。大多数Java EE服务器都支持此功能。
答案 3 :(得分:1)
gpeche提到的另一个选项是从事务中发送事务性JMS消息。然后让消息监听器(例如MDB bean)发送电子邮件。
EJB中的另一个技巧是在事务中调度计时器。计时器也是事务性的,只有在事务提交时才会启动。只需使用超时= 0的计时器,因此它将在事务提交后立即启动。