2

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

4

4 回答 4

2

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

于 2010-11-06T01:38:53.353 回答
2

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

TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
    @Override
    public void afterCommit() {
        super.afterCommit();
        sendEmail();
    }
});
于 2017-08-31T13:02:23.350 回答
1

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

于 2010-11-03T13:57:54.977 回答
1

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

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

于 2013-05-11T10:02:27.520 回答