一、exclusive consumer
broker會從多個consumers中挑選乙個consumer來處理queue中所有的訊息,從而保證了訊息的有序處理。如果這個consumer失效,那麼broker會自動切換到其它的consumer。
destination queue = session.createqueue("my-queue7?consumer.exclusive=true");messageconsumer consumer = session.createconsumer(queue);
二、message groups
message groups就是對訊息分組,它是exclusive consumer功能的增強:
邏輯上,message groups 可以看成是一種併發的exclusive consumer。跟所有的訊息都由唯一的consumer處理不同,jms 訊息屬性jmsxgroupid 被用來區分message group。
message groups特性保證所有具有相同jmsxgroupid 的訊息會被分發到相同的consumer(只要這個consumer保持active)。
//建立乙個message groups,只需要在message物件上設定屬性即可
message.setstringproperty("jmsxgroupid", "groupa");
//關閉乙個message groups,只需要在message物件上設定屬性即可\
message.setstringproperty("jmsxgroupid","groupa");
message.setintproperty("jmsxgroupseq", -1);
三、message selectors
consumer = session.createconsumer(destination, "jmstype = 'car' and weight > 2500");
1:jms selectors表示式中,可以使用in、not in、like等
2:需要注意的是,jms selectors表示式中的日期和時間需要使用標準的long型毫秒值
3:表示式中的屬性不會自動進行型別轉換,例如:
mymessage.setstringproperty("numberoforders", "2"); 那麼此時「numberoforders > 1」 求值結果會是false
4:message groups雖然可以保證具有相同message group的訊息被唯一的consumer順序處理,但是卻不能確
定被哪個consumer處理。在某些情況下,message groups可以和jms selector一起工作,
例如:設想有三個consumers分別是a、b和c。你可以在producer中為訊息設定三個message groups分別是「a」、「b」和「c」。然後令consumer a使用「jmxgroupid = 『a』」作為selector。b
和c也同理。這樣就可以保證message group a的訊息只被consumer a處理。需要注意的是,這種做法有
以下缺點:
(1)producer必須知道當前正在執行的consumers,也就是說producer和consumer被耦合到一起。
(2)如果某個consumer失效,那麼應該被這個consumer消費的訊息將會一直被積壓在broker上
四、slow consumer handling
慢消費者會在非持久的topics上導致問題:一旦訊息積壓起來,會導致broker把大量訊息儲存在記憶體中,broker也會因此而變慢。目前activemq使用pending message limit strategy來解決這個問
題。除了prefetch buffer之外,你還要配置快取訊息的上限,超過這個上限後,新訊息到來時會丟棄舊訊息。
通過在配置檔案的destination map中配置pendingmessagelimitstrategy,可以為不用的topic namespace配置不同的策略。
pending message limit strategy(等待訊息限制策略)目前有以下兩種:
1:constant pending message limit strategy limit可以設定0、>0、-1三種方式: 0表示:不額外的增加其預存大小。 >0表示:再額外的增
加其預存大小。 -1表示:不增加預存也不丟棄舊的訊息。 這個策略使用常量限制,配置如下:
2:prefetch rate pending message limit strategy
這種策略是利用consumer的之前的預存的大小乘以其倍數等於現在的預存大小。比如:
3:說明:在以上兩種方式中,如果設定0意味著除了prefetch之外不再快取訊息;如果設定-1意味著禁止丟棄訊息
Python高階特性
l csx sarah tracy bob jack print l 0 l 1 l 2 輸出 csx sarah tracy l 0 3 輸出 csx sarah tracy 如果第乙個索引是0,還可以省略 print l 2 輸出 bob jack print l 2 1 輸出 bob d fo...
高階OOP特性
注意 高階oop特性只在php5及以上版本支援 抽象類 命名空間需要5.3及以上 在php5中,將所有對物件都看作引用,而不是值。那麼如何建立物件的副本呢?答案就是轉殖物件。語法 destinationobject clone targetobject 可以在乙個類裡面定義乙個 clone 方法來調...
Python高階特性
python 高階特性 from collections import iterable from collections import iterator 切片 list切片 l list range 100 print l 0 3 取前3個元素 print l 3 取前3個元素 print l 4...