2010-11-03 73 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