2013-06-18 4 views
0

В настоящее время я использую NMS для разработки ActiveMQ на основе приложений (5.6).ActiveMQ: несколько потребителей подключены к одной очереди, но только один потребитель получает все сообщения

У нас есть несколько потребителей (exe), пытающихся получить массу из одной очереди (не тема). Хотя все сообщения просто все идут одному потребителю, хотя я заставил потребителя спать в течение нескольких секунд после получения сообщения. Кстати, мы не хотим, чтобы потребители получали одни и те же сообщения, полученные другими потребителями.

На официальном сайте указано, что мы должны установить префикс Префикса, чтобы определить, сколько сообщений может быть передано потребителю в любой момент времени. И он может быть сконфигурирован и закодирован.

Один из способов, которым я пытался, - это код с использованием класса 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 сервера, как показано ниже. "producerFlowControl =" истинный "MemoryLimit = "5mb"/> "producerFlowControl =" истинный" MemoryLimit = "5mb"> Но хотя я задал dispatchpolicy в сообщения по-прежнему относятся к одному потребителю.

Я хочу знать, что: Можно ли достичь такого поведения, просто настроив XML-файл сервера, чтобы все потребители получали сообщения из одной очереди? Если да, то как настроить это и что не так с моей конфигурацией? Если нет, как я могу использовать коды для достижения цели? Спасибо.

ответ

2

Посмотрите на «Группы сообщений».

У меня была та же проблема. Только один потребитель обрабатывал все сообщения. Я нашел в моем коде я использовал заголовок группы во время отправки:

request.Properties["NMSXGroupID"] = "cheese"; 

Согласно официальной документации:

Стандартный заголовок JMS JMSXGroupID используется для определения того, какие сообщения группы сообщение принадлежит. Затем функция группы сообщений гарантирует, что все сообщения для одной и той же группы сообщений будут отправлены в тот же JMS потребитель, пока потребитель остается в живых. Как только покупатель умрет, будет выбран другой.

Посмотреть полную информацию в http://activemq.apache.org/message-groups.html