2017-02-14 76 views
0

我使用的是activemq(對我來說很新穎),我有一個生產者和幾個消費者。如何爲我在activemq中的每個消費者創建單獨的隊列?

事情是,我想,以解決特定消費者的消息。 我讀到selectors也讀到it is a bad practice使用,也瞭解了一些alternatives

這種方案聽起來對我好,但我不知道我怎麼能創造這些隊列爲每一個我的奴隸之一。 我的奴隸的每個人都有一個ID(UUID)時,我創建了聽衆,我可以使用 - 這樣的:

<jms:listener-container 
     container-type="default" 
     connection-factory="jmsConnectionFactory" 
     acknowledge="auto"> 
    <jms:listener destination="slave.tasks.${slave.id}" ref="jmsActivityListener" method="onMessage" /> 
</jms:listener-container> 

這需要slave.properties文件包含以下項:

slave.id=XXXXXXX 

我的問題是:

1)是的方式做到這一點(限定每個接收者的隊列)?

2)我怎麼能產生這種salve.id值(我不希望用戶填寫,因爲它必須是唯一的)?

感謝

回答

0

虛擬主題救援

背後的虛擬主題的想法是,生產者發送到主題中的常用方式JMS。消費者可以繼續在JMS規範中使用Topic語義。但是,如果主題是虛擬的,則消費者可以從物理隊列中消費邏輯主題訂閱,從而允許許多消費者在許多機器上運行以對負載進行負載平衡。 例如,假設我們有一個名爲VirtualTopic.Orders話題。 (其中前綴VirtualTopic指示其虛擬主題)。而且我們邏輯上希望向系統A和B發送訂單。現在,對於常規的持久主題,我們將爲clientID_A創建JMS使用者,併爲clientID_B和「B」創建「A」。 通過虛擬主題,我們可以直接前進並消費排隊Consumer.A.VirtualTopic.Orders成爲系統A的消費者或消費到Consumer.B.VirtualTopic.Orders成爲系統B的消費者。 我們現在可以讓消費者的每一個系統,則使得所有系統中的信息的處理一次,以及同樣的系統B.

http://activemq.apache.org/virtual-destinations.html

爲系統A或B信息競爭池
<jms:listener-container 
     container-type="default" 
     connection-factory="jmsConnectionFactory" 
     acknowledge="auto"> 
    <jms:listener destination="Consumer.#{T(java.lang.System).currentTimeMillis()}.VirtualTopic.tasks" ref="jmsActivityListener" method="onMessage" /> 
</jms:listener-container> 

您的生產者可以將消息發送到主題"VirtualTopic.tasks"和這些信息將被髮送到所有Consumer.*.VirtualTopic.tasks隊列

+0

感謝您的答覆,但我認爲這不會解決我的問題 - 因爲我想將消息發送到特定的消費者(不是全部)。如果我正確理解這一點,這更像是一個我想避免的Topic解決方案,因爲消息必須發送給一個消費者(例如100),所以我不想使用主題( – Noam

+0

如果您在jmsConnectionFactory中使用admins角色的用戶/ pwd,則您的目標將在運行時自動創建,但您需要找到將每個用戶映射到其編號的解決方案 –

+0

是的 - 我知道並且正在使用管理員的信譽。但我需要一種方法來配置從屬端的偵聽器 - 爲此,我需要知道不屬於配置的id(正如我在我的問題中提到的) – Noam

相關問題