2012-01-09 19 views
0

我有一個帶有JPA/hibernate後端的多線程應用程序(運行在servlet容器中)。此應用程序允許通過簡單的URL檢索文件。在第一次下載文檔(即接收到對特定URL的請求)時,應用程序應通過電子郵件發送通知消息並將文檔標記爲在數據庫中檢索到。如何確保多線程JPA應用程序中的單一操作

確保每個文檔只發送一封電子郵件的正確方法是什麼?由於可能多次單擊檢索文檔的鏈接,因此可能會有並行事務(在不同的線程中)。這些交易只有在實施時纔會看到它們各自的結果。

回答

1

由於發送郵件不是事務性的,我看到了兩個可能性:

  • 使用全局事務更新retrieaval狀態和SENS一個JMS消息,表明電子郵件必須發送。應該在文檔實體上激活樂觀併發(使用@Version字段)。這樣,如果由於樂觀併發檢查導致事務失敗,則不會發送JMS消息。當收到JMS消息時,您當然需要JMS偵聽器來實際發送電子郵件
  • 使用樂觀鎖定並將電子郵件從事務中發出。如果由於樂觀鎖定導致交易失敗,則不發送電子郵件。如果成功,則發送電子郵件。

或者你只是不在乎,並假設併發的首次下載將是非常特殊的。因此,您可能會收到兩封電子郵件,而非一封郵件,您只需在此情況下刪除多餘的電子郵件即可。

相關問題