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

时间:2010-11-03 13:43:02

标签: java spring email transactions xa

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

4 个答案:

答案 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的计时器,因此它将在事务提交后立即启动。