【问题标题】:Delaying sending of mail until transaction commits延迟发送邮件直到事务提交
【发布时间】:2010-11-03 13:43:02
【问题描述】:

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

【问题讨论】:

    标签: java spring email transactions xa


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 请避免仅使用代码的答案。至少解释一下您刚刚添加的代码。它将帮助其他用户了解所做的工作。
      • 谢谢,我已经添加了一些解释和 javadoc 链接。
      【解决方案3】:

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

      【讨论】:

      • 我同意,两阶段提交可能是不可能的,所以我需要的只是发送操作等待提交。似乎这正是“最后一次资源提交”所做的,谢谢。然而,尽管有很多资源解释什么是“最后一次资源提交”,但我仍然需要找到如何实现它的解释。我还要实现 XAResource 吗?
      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-28
        • 1970-01-01
        相关资源
        最近更新 更多