的方案是一種密碼的來自Web請求(也可能是其他郵件相關的任務在未來)重置郵件向用戶發送。要排隊或者不排隊與Java郵件
的參數我帶來的表進行排隊:
我相信Web請求,應儘可能快地
解耦從請求發送動作處理,更容易使外化郵件系統(如果將來需要)
我承認對排隊的論據:
- 用戶如果消息
什麼是這次討論更多的參數的發送過程中出現錯誤沒有得到反饋?對那些贊成排隊的人來說,你會如何執行隊列?計劃的行動?無限的出隊任務(當然有間隔)?
謝謝!
的方案是一種密碼的來自Web請求(也可能是其他郵件相關的任務在未來)重置郵件向用戶發送。要排隊或者不排隊與Java郵件
的參數我帶來的表進行排隊:
我相信Web請求,應儘可能快地
解耦從請求發送動作處理,更容易使外化郵件系統(如果將來需要)
我承認對排隊的論據:
什麼是這次討論更多的參數的發送過程中出現錯誤沒有得到反饋?對那些贊成排隊的人來說,你會如何執行隊列?計劃的行動?無限的出隊任務(當然有間隔)?
謝謝!
我建議你從應用業務邏輯中分離郵件的實際發送。這樣做是異常的。使用JMS或至少不同的線程發送此類通知郵件,原因如下:
你絕對不想同步發送,因爲郵件服務器可能很慢。
發送JMS消息並使用MDB發送電子郵件。
在Java EE 6+情況下,您可以在EJB方法使用@Asynchronous
註解。它返回一個Future<V>
。因此,您可以繼續處理並稍後詢問任務結束,而在另一個線程中執行。 因此,您可以快速接受大量請求,將發送操作與請求分開,並且您可以獲得反饋。 http://docs.oracle.com/javaee/6/tutorial/doc/gkkqg.html
我覺得你應該去排隊。因爲它有助於快速執行並檢查密碼重置請求是否來自正確的源。
所以你可以使用Map來實現隊列。因爲在地圖中,你可以使用電子郵件ID作爲鍵和唯一的請求參考作爲值。這個地圖元素應該在一段時間內刪除。
也讓快捷的電子郵件服務ü可以創建發送電子郵件的簡單線程類,並通過將一些數據參數在它啓動一個新線程。並且調度將由Web容器自動管理這些線程。
您可能認爲請求應儘可能快地提供服務,但用戶呢?他在想什麼?
用戶需要重置密碼。他不在乎需要多長時間。如果他無法完成這個請求,他根本無法做任何事情。
請勿排隊。
在這種情況下,它絕對不是*可選任務。 – EJP
你爲什麼這麼認爲?如果您希望有更多或更少的交付保證,那麼您需要通過您自己的SMTP基礎設施發送所有此類郵件,在這種情況下,它將成爲隊列的模擬,並且在tmp錯誤等情況下它會考慮重新傳送。但是如果你沒有它,那麼從性能的角度來看它會更好地異步執行 – Grigory
另外我還記得,即使你使用Java Mail或任何其他目標服務器同步發送郵件,目標服務器也會以250 OK響應它並不意味着該消息已經交付給最終用戶。可能會有多臺服務器參與其中,可能會因交付而失敗。所以如果你想實現真正的用戶友好解決方案,你還應該實現處理DSN消息等。 – Grigory