2010-03-03 43 views
4

我想知道:使用JMS或ThreadPool發送電子郵件

我有一個場景。如果用戶向系統添加產品(我正在開發),則會有一個偵聽器向用戶的客戶羣發送通知,通知用戶添加的新產品。

我讀過這個thread和(看到我從來沒有使用以前JMS也不ThreadPool)我不知道我是否應該使用JMS或ThreadPooling。

我正在使用Tomcat 5.5及更高版本和JBoss 5及更高版本(取決於公司的最後手段)部署我的Web應用程序。

如果我使用JMS,我使用Apache ActiveMQJBoss Messaging?它們是否兼容在兩個平臺上運行(Tomcat和JBoss)?

在此先感謝。

回答

3

對於應用程序之間的通信,JMS是一個非常好的解決方案,特別是對於事件和通知。JMS允許使用稱爲異步消息的發送和接收來發送和接收這種通知,由此發送者和接收者彼此不知道並且不需要同時可用。

ActiveMQ是一個非常廣泛使用的消息代理,爲Java,C/C++,C#,Perl,PHP,Python,Ruby等提供客戶端API。這允許在使用Java和其他語言編寫的應用程序中使用JMS。

爲了處理事件和通知,我已經實現了JMS消息傳遞許多次多種業務情況。絕大多數這些時間,無論使用什麼消息代理,我都推薦和/或使用Spring JMS。 Spring JMS非常易於使用,非常強大且具有高度可擴展性。 Spring JMS消除了創建自己的消息生成器和消息消費者的複雜性,這可以爲您節省大量時間。

要看看使用Spring JMS發送消息是多麼容易,請查看我最近編寫的一篇博客文章,標題爲Using the Spring JmsTemplate to Send JMS Messages。我還在編寫一篇關於使用Spring JMS接收消息的博客文章。

如果您還有其他問題,請告訴我。

布魯斯

+0

足夠有趣布魯斯,我正在讀這篇關於在JBoss上安裝ActiveMQ的文章。我在這一刻成功安裝了它(5分鐘或更少)。謝謝! :-)(現在,我需要刷新我的JBoss技能)。 – 2010-03-03 16:01:46

+0

和布魯斯,我如何在Tomcat上設置ActiveMQ? – 2010-03-03 16:03:01

+0

我也使用過這個確切的場景,儘管我使用了Spring Integration來處理消息的分派和消費。 – 2010-03-03 16:04:11

0

我會去尋找一個持久的JMS(我只使用過WLS JMS和Websphere MQ,所以無法比較AQ和JBoss,哪一個能夠更好地保證交付)。另外,我會認真考慮將電子郵件引擎作爲一個完全獨立的應用程序,具體取決於您希望流量增長多少。

+0

我正在寫一個名爲'MessagingQueueService'的庫,允許通過JMS發送電子郵件。這是好的,還是應該使用'ThreadPoolExecutor'? – 2010-03-05 12:34:33

1

我曾經有類似的需求,我們使用JMS。然後,主要問題是如何處理錯誤,因爲SMTP確實不是事務性的:

  1. 可以,如果某些電子郵件丟失了嗎?
  2. 可以,如果某些電子郵件發送兩次?

我們決定最好還是兩次發送郵件,並在這裏或多或少的設計,我們有:

  1. 我們依靠容器管理的事務,如果由於某種原因,電子郵件不能被髮送,我們決定回滾JMS事務;該消息稍後將由JMS重新發送,並且發送消息的新嘗試已完成。

  2. 如果JMS消息傳遞事務在發送電子郵件後失敗(例如,由於JMS問題),事務將自動回滾並且稍後重新傳遞消息。在這種情況下,電子郵件被髮送兩次,因爲STMP不是事務性的。

  3. 即使可以發送電子郵件(從代碼的角度來看),SMTP服務器以後仍可能有問題。在這種情況下,JMS已經交付和使用,因此我們無法知道哪些電子郵件已處理,以及如何手動重新發送。

但是我們已經在使用JMS。我不會介紹JMS,因爲主要的參數是JMS是事務性的,但SMTP不是。

我會選擇較輕的東西 - 可能是使用ThreadPool - 並將狀態存儲在數據庫中以知道需要發送或已發送哪些電子郵件。如果出現問題,您可以查看數據庫並做出臨時決定。

+0

關於使用ThreadPool +數據庫的輕量級解決方案來處理每天數以千計的電子郵件,您有什麼想法?你認爲它會擴展嗎?那麼在集羣中有多個應用程序(以及多個線程池)的情況下又如何寫入同一個數據庫呢? – talonx 2010-11-17 06:14:41

+0

@talonx每天一千封電子郵件每分鐘少於一封郵件。所以,如果你談論幾千,那麼無論如何,如果你談論成千上萬的話,那將取決於。數據庫將是一個瓶頸,但在這種情況下可能是可以接受的(我們沒有談及數十億封郵件,對吧?)。我不知道SMTP服務器如何擴展。那麼,這很難說,所以把這個評論當作一個瘋狂的猜測。 – ewernli 2010-11-17 08:17:18

+0

大約15k,最大可能是40k。 SMTP服務器可能無法擴展 - 所以線程池將不得不做某種速率控制。 – talonx 2010-11-17 10:14:07

1

我知道這個答覆很末到本dicsussion,但我希望它仍然會尋求在整合的ActiveMQ和Tomcat信息鄉親有價值。

我有很多人問我幫忙解決他們集成ActiveMQ和Tomcat的問題,所以我決定寫一些關於它的文章。這個主題不僅涉及ActiveMQ in Action(見第8章),而且我還發布了一系列文章,標題爲ActiveMQ and Tomcat: Perfect Partners。希望人們會發現這有幫助。