在ActiveMQ中,我被告知增加吞吐量的最佳解决方案是拥有多个连接,每个连接都有自己的会话和消费者。
我一直在尝试使用NMS(通过C#连接)来实现这一点,但是在MQ Web控制台的“Active Consumwers”屏幕中,我看到了所有的连接和放大器。消费者列出了我希望看到的消费者,但在下一栏中,他们都有一个“1”的sessionId。我本以为每个都有一个单独的会话ID。
这是对的吗?如果每个连接/消费者应该有不同的会话ID,我将如何确保创建这些额外的会话?
以下是我用来启动新连接的一些示例代码(这基于Remarks ActiveMQ transactional messaging introduction code):
public QueueConnection(IConnectionFactory connectionFactory, string queueName, AcknowledgementMode acknowledgementMode)
{
this.connection = connectionFactory.CreateConnection();
this.connection.Start();
this.session = this.connection.CreateSession(acknowledgementMode);
this.queue = new ActiveMQQueue(queueName);
}
...每次我正在打开的每个连接都会这样做。
答案 0 :(得分:0)
看起来这段代码是我问题的根源:
public SimpleQueueListener CreateSimpleQueueListener(IMessageProcessor processor)
{
IMessageConsumer consumer = this.session.CreateConsumer(this.queue, "2 > 1");
return new SimpleQueueListener(consumer, processor, this.session);
}
因为它正在为所有消费者使用公共会话(this.session)。通过每次创建一个新会话(并将其保存在集合中或通过其他方式),我实现了在同一连接中在其自己的会话上操作每个侦听器的目标。例如:
public SimpleQueueListener CreateSimpleQueueListener(IMessageProcessor processor)
{
var listenerSession = this.connection.CreateSession();
IMessageConsumer consumer = listenerSession.CreateConsumer(this.queue, "2 > 1");
return new SimpleQueueListener(consumer, processor, listenerSession);
}