ActiveMQ: несколько потребителей подключены к одной очереди, но только один потребитель получает все сообщения
В настоящее время я использую NMS для разработки приложений ActiveMQ(5.6).
У нас есть несколько потребителей (exe), пытающихся получить сообщения из одной очереди (не по теме). Хотя все сообщения просто отправляются одному потребителю, я заставляю его спать несколько секунд после получения сообщения. Кстати, мы не хотим, чтобы потребители получали те же сообщения, которые получали другие потребители.
На официальном сайте упоминается, что мы должны установить Prefetch Limit, чтобы решить, сколько сообщений может быть передано потребителю в любой момент времени. И это может быть настроено и закодировано.
Один из способов, которыми я пытался, - это кодирование с использованием класса PrefetchPolicy, связывающего класс ConnectionFactory, как показано ниже
PrefetchPolicy poli = new PrefetchPolicy();
poli.QueuePrefetch = 0;
ConnectionFactory fac = new ConnectionFactory("activemq:tcp://Localhost:61616?jms.prefetchPolicy.queuePrefetch=1");
fac.PrefetchPolicy = poli;
using (IConnection con = fac.CreateConnection())
{
using (ISession se = con.CreateSession())
{
IDestination destination = SessionUtil.GetDestination(se, queue, DestinationType.Queue);
using (IMessageConsumer consumer = se.CreateConsumer(queue1))
{
con.Start();
while (true)
{
ITextMessage message = consumer.Receive() as ITextMessage;
Thread.Sleep(2000);
if (message != null)
{
Task.Factory.StartNew(() => extractAndSend(message.Text)); //do something
}
else
{
Console.WriteLine("No message received~");
}
}
}
}
}
Но независимо от того, какое значение предварительной выборки я задаю, поведение потребителей остается прежним.
И я попробовал второй способ связывания, чтобы получить результат, а именно настроить файл конфигурации сервера. Я изменяю activemq.xml сервера, как показано ниже. "sellerFlowControl="true" memoryLimit="5 МБ " /> " providerFlowControl = "true" memoryLimit = "5 МБ"> Но, несмотря на то, что я установил диспетчеризацию, сообщения по-прежнему отправляются одному потребителю.
Я хочу знать, что: можно ли добиться такого поведения, просто настроив XML-файл сервера, чтобы все потребители могли получать сообщения из одной очереди? Если да, как это настроить и что не так с моей конфигурацией? Если нет, то как я могу использовать коды для достижения цели? Благодарю.
1 ответ
Взгляните на функцию "Группы сообщений".
У меня такая же проблема. Только один потребитель обработал все сообщения. Я нашел в своем коде, я использовал заголовок группы во время отправки:
request.Properties["NMSXGroupID"] = "cheese";
Согласно официальным документам:
Стандартный JMS-заголовок JMSXGroupID используется для определения того, к какой группе сообщений относится сообщение. Функция группы сообщений затем гарантирует, что все сообщения для одной и той же группы сообщений будут отправлены одному и тому же потребителю JMS - пока этот потребитель остается в живых. Как только потребитель умрет, будет выбран другой.
Смотрите полную информацию на http://activemq.apache.org/message-groups.html