2017-02-14 44 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

相关问题