我目前正在使用NMS开发基于应用程序的ActiveMQ(5.6)。
我们有几个消费者(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~");
}
}
}
}
}
但无论我设置什么预取值,消费者的行为都保持不变。
我尝试了第二种方法来获得结果,即配置服务器配置文件。我像bellow一样更改服务器的activemq.xml。 “producerFlowControl =”true“memoryLimit =”5mb“/> “producerFlowControl =”true“memoryLimit =”5mb“> 但是,尽管我已经设置了dispatchpolicy,但邮件仍然会传递给一个消费者。
我想知道: 是否可以通过配置服务器xml文件以使所有使用者从一个队列接收消息来实现此行为?如果是这样,如何配置这个以及我的配置有什么问题?如果没有,我如何使用代码来实现目标? 感谢。
答案 0 :(得分:2)
查看“消息组”功能。
我遇到了同样的问题。只有一个消费者处理了所有消息我在代码中发现我在发送过程中使用了组头:
request.Properties["NMSXGroupID"] = "cheese";
根据官方文件:
的完整详情标准JMS头JMSXGroupID用于定义哪个消息组 消息属于。然后,消息组功能可确保这一点 同一消息组的所有消息都将发送到同一个JMS 消费者 - 当消费者保持活力时。一旦消费者 将选择另一个人。