我有一個簡單的程序,每隔一段時間輪詢一次數據庫表,併發送表中指示爲掛起的任何郵件(使用javax.mail)。郵件發送時,我刪除數據庫條目。儘可能以事務方式發送郵件
我注意到兩個潛在的問題
- 有發送郵件的可能性,然後崩潰的東西所以DB項是仍然存在。下一次郵件將再次發送。
- 可能會有大量郵件發送,因此我加載所有待處理的條目,將它們全部發送,然後刪除所有數據庫條目。如果某些/所有郵件被髮送,某些內容會失敗,並且該作業會再次運行,然後會讓很多人感染兩次。
這不是一個垃圾郵件應用程序,所以我想嘗試避免發送任何兩次,確保我永遠不會「丟失」一條消息。
這是一個普遍問題我確定哪裏有兩個物理資源不能參與事務(DB +別的東西),所以我想知道人們用什麼方法來減少/消除這種情況下的問題和/或一般情況。
這對我來說似乎很糟糕。您可以發送所有電子郵件,然後由於某些與電子郵件無關的原因而導致事務回滾,並且您已被搞砸。 – 2010-10-25 13:31:01
@Nathan Hughes - 當然,存在這種風險,但如果您在提交之前發送它們,則可以通過最大限度地減少崩潰導致該情況的時間窗口來最大限度地降低風險。由於電子郵件不是事務性的(一旦它們被髮送,它們被髮送),沒有其他方式。 – 2010-10-25 13:47:27