延迟发送邮件直到事务提交

有没有人有一个很好的教程或一些关于如何实现自己的XAResource的建议? 我需要Spring的MailSender是事务性的,因此只有在事务提交后才会发送邮件,而且似乎没有任何现有的事务包装器。

如果您只需要等待提交,正如您在评论中所说的那样,您可以使用TransactionSynchronizationManager.registerSynchronization()来调查以在提交时触发电子邮件发送。

您可以将TransactionSynchronizationManager.registerSynchronization (如gpeche提到的)与TransactionSynchronizationAdapter一起使用,该TransactionSynchronizationAdapter具有在当前事务的各个阶段调用的各种方法。 我认为最合适的方法是afterCommit 。

 TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() { @Override public void afterCommit() { super.afterCommit(); sendEmail(); } }); 

我怀疑是否可以为SMTP实现真正的XAResource。 资源管理器(本例中为SMTP服务器)应该有事务支持,我不相信有任何支持。 我想说你最好的选择是“上次资源提交”模式 – 它允许一个非XA资源参与XA事务。 搜索Google,有很多信息。 大多数Java EE服务器都支持此function

gpeche提到的另一个选项是从事务中发送事务JMS消息。 然后让消息监听器(例如MDB bean)发送电子邮件。

EJB中的另一个技巧是在事务中调度计时器。 计时器也是事务性的,只有在事务提交时才会启动。 只需使用超时= 0的计时器,因此它将在事务提交后立即启动。