2015-12-14 49 views
1

我正在使用託管執行程序服務來實現一個進程管理器,它將在接收到JMS消息事件後在後臺處理任務。通常情況下,會有少量任務運行(最大可能爲10個),但如果發生了什麼情況,並且我的應用程序開始獲取數百個JMS消息事件。我如何處理此類事件?如何管理託管執行程序服務

我的想法是限制線程的數量,如果可能的話,並將所有其他消息保存到數據庫,並將在線程可用時運行。提前致謝。

回答

1

我的想法是限制線程的數量,如果可能的話,並保存所有其他消息到數據庫,並將在線程可用時運行。

此問題的詳細答案取決於您選擇運行哪個Java EE應用服務器,因爲它們都具有稍微不同的配置。

任何Java EE應用服務器都將允許您配置Managed Executor Service(MES)的線程池大小,這是線程池的工作線程數。

假設您有10個工作線程,並且您一次充滿100個請求,那麼MES將保留一個積壓的請求隊列,並且工作線程將在隊列完成工作後離開隊列,直到隊列是空的。

現在,如果工作進入隊列有時就好了,但是如果總體上你的工作隊列增加得比你的工作線程更快,那麼你將遇到問題。解決這個問題的方法是增加線程池的大小,否則積壓將會超出,服務器將耗盡內存。

如果發生了什麼情況,我的應用程序開始獲取數百個JMS消息事件。我如何處理此類事件?

如果您的服務器上的負載會如此零星該任務需要被保存到數據庫中,似乎最好的辦法是要麼:

  1. 增加線程池的大小
  2. 當任務積壓隊列已滿時,服務器立即拒絕傳入任務
  3. 有客戶端阻止等待服務器任務隊列未滿(如果客戶端任務提交與用戶沒有任何聯繫,我只會建議此選項經驗)
+0

我喜歡選項3,因爲這些都是任務將在後臺運行,並會在用戶完成時通知用戶。 選項1會很好,但我不知道我會得到多少個JMS消息事件。 選項2將是我的第二選擇。我的應用程序會停止爲新任務調用外部休息服務,並等待有可用線程。 謝謝你回答我的問題。 – SpyClown

+0

再次閱讀選項3後。我認爲選項2是最好的選擇:D – SpyClown