2013-07-26 104 views
2

我正在構建一個使用Java後端(和SQL Server)的系統,該系統允許用戶創建任務並配置這些任務以在截止日期之前發送電子郵件提醒(如前一天,前七天,等等)。消息體系結構

我擔心的是,如果出於任何原因(計劃內或計劃外)出現服務中斷並且在發生故障時會發送提醒,那麼在系統恢復時如何確保發送錯過的提醒? (請注意,提醒中沒有回覆或確認信息。)停機時間可能爲5分鐘或5天。而且我想確定是否有發送提醒的隊列,並且中間發生中斷,系統回來時沒有兩次發送提醒。

我對Java消息服務稍微熟悉,並且有可選的持久屬性以及與JMS同步/異步。我可以使用JMS來實現這個目標嗎?有沒有其他現有的框架可以支持我想要的,而無需從頭開始構建。我特別感興趣的是開源框架或實現。

+0

我做了一些類似於你的請求的表,使用一張表來存儲所有要用'SEND_STATUS'和Java Job發送的電子郵件來實際完成這項工作。也許可以滿足你的需求。 – araknoid

回答

2

我將第一重構你的要求:

  1. 建立一個服務來發送電子郵件
  2. 服務必須具備故障恢復,在youcase如果系統出現故障,回來了,應該還送出了待定電子郵件提醒
  3. 您不希望發送消息的任何確認。

考慮到這些需求,有幾種方法可以做到這一點,有許多框架和工具,其中一些可能是您的需求的過度工程。這裏是我的建議:

  1. 使用Java郵件API發送電子郵件提醒
  2. 創建一個表存儲提醒發送和郵件發送提醒的
  3. 後,如果系統更新標誌變爲下來,你可以重新發送所有未設置標誌的提醒。

您可以使用JMS,但由於您只需要發送保證的電子郵件,我建議保持簡單。

乾杯!

+0

謝謝。這非常有幫助,可能是我們將採取的方法。 –

1

我會在數據庫中使用一張表格,我會在發送電子郵件提醒時最後一次存儲該表格。當系統啓動時,應該檢查最後一次,將其與日程安排進行比較併發送缺少的電子郵件。

0

就像所有'use-table-in-db'答案的反指向一樣。

當然你幾乎可以使用任何JMS服務器。例如,HornetQ。當你需要安排發送電子郵件,把消息隊列時延:

TextMessage msg = session.createTextMessage(); 
msg.setText(text); 
msg.setStringProperty("recipient", emailTo); 
msg.setLongProperty("_HQ_SCHED_DELIVERY", System.currentTimeMillis() + TimeUnit.MILLISECONDS.convert(value, unit)); 

消息將及時交付,您的異步消息處理程序可以將它發送給收件人。您可以在多個線程中處理郵件,如果需要,您可以通過不同的smtp服務器發送電子郵件。 HornetQ很容易與Spring集成。

如果你設置了消息的持久性,HornetQ會將它存儲在內部數據庫中,並在重新啓動後恢復隊列內容。

但是。這增加了項目的複雜性,有時它不太好,所以DB中的表可能是更好的選擇。

+0

我認爲我們要使用數據庫方法,但這個也很有趣。謝謝! –