我有一個情況,我有一個activemq代理與2個隊列,Q1和Q2。我有兩個使用activemessaging的基於ruby的消費者。我們稱他們爲C1和C2。兩個消費者都訂閱每個隊列。訂閱每個隊列時,我將activemq.prefetchSize設置爲1。我也設置了ack =客戶端。activemeqaging與跺腳和activemq.prefetchSize = 1
考慮事件的序列如下:
1)觸發一個長時間運行的工作被髮布到隊列Q1的消息。稱這個M1。
2)M1發送給消費者C1,開始長時間的操作。
3)兩條觸發短作業的消息被髮布到隊列Q2。稱這些M2和M3。
4)M2被派遣到C2快速運行短期工作。
5)即使C1仍在運行M1,M3仍被分派到C1。它能夠分派到C1,因爲在隊列訂閱上設置了prefetchSize = 1,而不是在連接上。所以Q1消息已經被分派的事實並不會阻止一個Q2消息被分派。
由於主動消費者是單線程的,最終結果是M3坐在C1上等待很長時間直到C1完成處理M1。所以,儘管事實上消費者C2處於空閒狀態(因爲它很快完成了消息M2),所以M3不被處理很長一段時間。
從本質上講,無論什麼時候運行一個長的Q1作業,然後創建了一大堆短的Q2作業,恰好有一個短的Q2作業卡住了等待第一季度作業完成的消費者。
有沒有辦法在連接級別而不是在訂閱級別設置prefetchSize?我真的不希望在處理M1時向C1發送任何消息。另一種選擇是我可以創建一個專門處理Q1的消費者,然後讓其他消費者致力於處理Q2。但是,由於Q1消息不多,我寧願不這樣做 - Q1的專門消費者會在一天的大部分時間內閒置以佔用內存。
感謝您的回覆。我們使用處理器組來區分高優先級和低優先級作業。高優先級的工作是由我們的用戶界面啓動的,低優先級的工作由cron啓動。我們可以在這裏使用一個處理器組,但是長時間運行的工作實際上每天只能啓動一次。我們可以從activemq中完全刪除它。對於長期的工作,我們主要是使用activemq進行容錯,因爲我們在多個服務器上擁有消費者。 – 2010-06-03 23:19:18