2010-11-03 101 views
2

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

回答

1

我怀疑是否有可能为SMTP实现真正的XAResource。资源管理器应该有事务支持(在这种情况下是SMTP服务器),我不相信有任何支持。我会说你最好的选择是'上次资源提交'模式 - 它允许一个非XA资源参与XA事务。搜索谷歌,有很多信息。大多数Java EE服务器都支持这个。

+0

我同意,两阶段提交可能没有问题,所以我需要的是发送操作等待提交。看起来这正是'上次资源提交'所做的,谢谢。然而,虽然有很多资源解释'最后的资源提交'是什么,但我仍然需要找到一个解释如何实现它。我还会实现一个XAResource吗? – Zecrates 2010-11-04 05:05:55

1

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

EJB中的另一个诀窍是从事务中调度一个计时器。计时器也是事务性的,只会在事务提交时启动。只需使用timeout = 0的计时器,它将在事务提交后立即启动。

2

您可以使用TransactionSynchronizationManager.registerSynchronizationTransactionSynchronizationAdapter具有各种各样的被称为在当前事务的各个阶段的方法(如gpeche提到)。我认为这个问题最适合的方法是afterCommit

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

请避免代码只回答。至少说一下你刚添加的代码的解释。它将帮助其他用户了解所做的事情。 – 2017-08-31 13:08:35

+1

谢谢,我添加了一些解释和javadoc链接。 – 2017-08-31 13:27:02