JMS Queue: несколько потоков для чтения


У меня есть Java-программа, которая ставит в очередь на другой стороне очереди, у меня есть 10-15 потребителей; любой ОДИН из которых должен прочитать сообщение и обработать его. Если какой-либо из 10-15 потребителей освобождается, он получает следующее сообщение из очереди.



По сути, потребитель может забрать сообщение из очереди, когда оно освободится, и только один потребитель должен его забрать. (без каких-либо блоков синхронизации или около того).
Также со стороны отправителя могу ли я приостановить отправку сообщений в очередь, если размеры очереди переполнятся (или достигнут определенного порога)?


Я новичок в JMS API. Извиняюсь, если это вопрос новичка.


Спасибо!!


person Shalabh    schedule 27.02.2014    source источник
comment
каков твой вопрос? да, вы можете прекратить отправку сообщений в очередь, если хотите.   -  person eis    schedule 28.02.2014
comment
@eis Я думал, что мой вопрос ясен. Если это не так.. Мне нужно отправлять сообщения в очередь, и у меня есть 20 потоков, работающих как потребители, которые могут забирать данные из очереди (как только они свободны). поэтому, когда каждый поток освобождается, он переходит в очередь, проверяет, есть ли данные, которые он получает, и т. д. Это выполнимо? Спасибо за помощь.   -  person Shalabh    schedule 28.02.2014
comment
хорошо, вы не указали эту выполнимую часть, поэтому не было ясно, в чем был вопрос.   -  person eis    schedule 28.02.2014


Ответы (1)


Мне нужно отправлять сообщения в очередь, и у меня есть 20 потоков, работающих как потребители, которые могут забирать данные из очереди (как только они свободны). поэтому, когда каждый поток освобождается, он переходит в очередь, проверяет, есть ли данные, которые он получает, и т. д. Это выполнимо?

Да, это выполнимо — это стандартный процесс с очередями JMS. Другой альтернативой могут быть темы, но с темами каждый слушатель должен будет обрабатывать одно и то же сообщение, а не только одно, поэтому очереди — это то, что вам нужно. Хотя обычно у вас не потоки в качестве потребителей (я даже не уверен, что это значит), а bean-компоненты, управляемые сообщениями. Вы могли бы подумать об их использовании. В любом случае MDB работают в своем собственном потоке.

person eis    schedule 28.02.2014
comment
Спасибо за терпение и ответ на это :) . Я все еще не могу получить это. Видите ли, у меня должно быть 10 потребителей, слушающих одну и ту же очередь/тему, и ТОЛЬКО один должен получить сообщение (всякий раз, когда потребитель свободен или опрашивает очередь для сообщения). Можете ли вы предоставить мне какие-либо ссылки? где я могу прочитать об этом и сэкономить ваше время. - Спасибо еще раз! - person Shalabh; 28.02.2014
comment
@user1613403 user1613403 Кажется, я уже ответил на этот вопрос. Это стандартный процесс работы с очередями JMS. Темы не поддерживают это. - person eis; 28.02.2014
comment
Хорошо, я читал об этом, и я думаю, что так это можно сделать. Однако нет никакого способа контролировать количество сообщений, находящихся в очереди. Очередь не может быть измерена в соответствии с количеством сообщений - person Shalabh; 01.03.2014
comment
@user1613403, конечно, есть, см. этот пример конфигурации weblogic и для OpenMQ. кроме того, для всех реализаций вы можете проверить количество сообщений в очереди в любой момент времени и действовать соответствующим образом. - person eis; 01.03.2014
comment
О, мой плохой, я использую ActiveMQ, не знаю, как с этим справиться ... и есть ли какой-нибудь способ ... уведомить моих потребителей, чтобы они закрылись? или сообщение больше не будет ставиться в очередь? как ввод данных закончен или так? - person Shalabh; 01.03.2014
comment
почему потребители закрываются? - person eis; 01.03.2014
comment
Я думаю, вам стоит попробовать какую-нибудь книгу по основам JMS. Это и это может помочь вам начать работу. - person eis; 01.03.2014