2017-02-14 2 views
0

Я использую activemq (довольно новый для меня), и у меня есть один продюсер и несколько потребителей.Как создать отдельную очередь для каждого потребителя, который у меня есть в activemq?

Вещь, я хочу обращаться к сообщениям для конкретных потребителей. Я читал около selectors, но также прочитал, что it is a bad practice использовать, а также прочитать около alternatives.

Альтернатива звучит хорошо для меня, но я не уверен, как я могу создать эти очереди для каждого из моих рабов. Каждый из моих рабов имеет идентификатор (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 пути. Потребители могут продолжать использовать семантику Topic в спецификации JMS. Однако, если тема виртуальная, потребитель может потреблять из физической очереди для подписки на логические темы, что позволяет многим потребителям работать на многих машинах & потоков для загрузки баланса нагрузки. Например, предположим, что у нас есть тема под названием VirtualTopic.Orders. (Где префикс VirtualTopic указывает на его виртуальную тему). И мы логически хотим отправлять заказы в системы A и B. Теперь с регулярными долговечными темами мы создали бы JMS-клиента для clientID_A и «A» вместе с clientID_B и «B». С виртуальными темами мы можем просто идти прямо вперед и потреблять в очередь Consumer.A.VirtualTopic.Orders быть потребителем для системы A или потреблять до Consumer.B.VirtualTopic.Orders быть потребителем системы B. Теперь мы можем иметь пул потребителей для каждой системы, которые затем конкурировать сообщений для систем а и в такие, что все сообщения для системы обрабатываются ровно один раз и аналогично для системы B.

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

<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

Спасибо за ответ, но я думаю, что это не решит мою проблему - так как я хотел бы послать сообщение конкретного потребителя (не всех).Если я это правильно понимаю, это скорее решение темы, которое я хочу избежать, поскольку сообщение должно быть отправлено одному потребителю (из, скажем, 100), поэтому я бы не хотел использовать тему (среди прочих причин) – Noam

+0

, если вы используете user/pwd в jmsConnectionFactory с ролью админов, ваши цели будут созданы автоматически во время выполнения, но вам нужно найти решение для сопоставления каждого потребителя с их идентификатором. –

+0

Да - я знаю, что и использую администраторы доверяют. но мне нужен способ настроить слушателей в подчиненной части - в этом отношении мне нужно знать идентификатор, который не является частью конфигурации (как я уже упоминал в моем вопросе) – Noam

Смежные вопросы