ActiveMQ - 每个会话多个连接?

时间:2010-08-20 07:23:20

标签: c# activemq

在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);
}

...每次我正在打开的每个连接都会这样做。

1 个答案:

答案 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);
}