2014-03-04 34 views
3

的方案是一種密碼的來自Web請求(也可能是其他郵件相關的任務在未來)重置郵件向用戶發送。要排隊或者不排隊與Java郵件

的參數我帶來的表進行排隊:

  • 我相信Web請求,應儘可能快地

  • 解耦從請求發送動作處理,更容易使外化郵件系統(如果將來需要)

我承認對排隊的論據:

  • 用戶如果消息

什麼是這次討論更多的參數的發送過程中出現錯誤沒有得到反饋?對那些贊成排隊的人來說,你會如何執行隊列?計劃的行動?無限的出隊任務(當然有間隔)?

謝謝!

回答

2

我建議你從應用業務邏輯中分離郵件的實際發送。這樣做是異常的。使用JMS或至少不同的線程發送此類通知郵件,原因如下:

  1. 它是definetly可選任務。用它阻止App服務器不是一個好主意。
  2. 發送郵件可能是耗時的操作。 即使您使用位於託管應用程序的服務器附近的自己的內部郵件服務器。 SMTP對話由交換請求/響應組成,而不僅僅是一個呼叫。 (這就是引入Pipelining的原因)
  3. 不要將郵件作爲事務性操作發送。 當目標SMTP服務器以250 OK作爲DATA命令的響應回覆時 - 它只負責此郵件的其他任何操作。 當後續服務器連鎖店無法發送郵件時,傳送可能會失敗(請閱讀有關DSN的信息)。 這意味着如果後續服務器失敗,用戶將不會收到任何反饋。
+0

在這種情況下,它絕對不是*可選任務。 – EJP

+0

你爲什麼這麼認爲?如果您希望有更多或更少的交付保證,那麼您需要通過您自己的SMTP基礎設施發送所有此類郵件,在這種情況下,它將成爲隊列的模擬,並且在tmp錯誤等情況下它會考慮重新傳送。但是如果你沒有它,那麼從性能的角度來看它會更好地異步執行 – Grigory

+0

另外我還記得,即使你使用Java Mail或任何其他目標服務器同步發送郵件,目標服務器也會以250 OK響應它並不意味着該消息已經交付給最終用戶。可能會有多臺服務器參與其中,可能會因交付而失敗。所以如果你想實現真正的用戶友好解決方案,你還應該實現處理DSN消息等。 – Grigory

2

你絕對不想同步發送,因爲郵件服務器可能很慢。

發送JMS消息並使用MDB發送電子郵件。

1

在Java EE 6+情況下,您可以在EJB方法使用@Asynchronous註解。它返回一個Future<V>。因此,您可以繼續處理並稍後詢問任務結束,而在另一個線程中執行。 因此,您可以快速接受大量請求,將發送操作與請求分開,並且您可以獲得反饋。 http://docs.oracle.com/javaee/6/tutorial/doc/gkkqg.html

0

我覺得你應該去排隊。因爲它有助於快速執行並檢查密碼重置請求是否來自正確的源。

所以你可以使用Map來實現隊列。因爲在地圖中,你可以使用電子郵件ID作爲鍵和唯一的請求參考作爲值。這個地圖元素應該在一段時間內刪除。

也讓快捷的電子郵件服務ü可以創建發送電子郵件的簡單線程類,並通過將一些數據參數在它啓動一個新線程。並且調度將由Web容器自動管理這些線程。

1

您可能認爲請求應儘可能快地提供服務,但用戶呢?他在想什麼?

用戶需要重置密碼。他不在乎需要多長時間。如果他無法完成這個請求,他根本無法做任何事情。

請勿排隊。