Consumer高階特性

2022-08-30 22:18:28 字數 2537 閱讀 4389

一、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...