2010-08-20 101 views
0

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

...这正在每次所做每个我的连接开幕。由于它使用一个共同的会话(this.session)的所有消费者

public SimpleQueueListener CreateSimpleQueueListener(IMessageProcessor processor) 
{ 
    IMessageConsumer consumer = this.session.CreateConsumer(this.queue, "2 > 1"); 
    return new SimpleQueueListener(consumer, processor, this.session); 
} 

+0

您使用的是什么版本的ActiveMQ和NMS? – Noctris 2010-09-16 13:37:15

+0

另一个问题:你在创建IConnectionFactory时是否意外设置了Clientid?我快速浏览了源代码并注意到这会被推送到连接ID以及可能的会话中:s – Noctris 2010-09-16 13:41:38

回答

0

它看起来这段代码是我的问题的根源。通过每次创建一个新会话(并将其保存在一个集合中或通过其他方式),我已经实现了在同一个连接中在各自的会话中操作每个侦听器的目标。例如:

public SimpleQueueListener CreateSimpleQueueListener(IMessageProcessor processor) 
{ 
    var listenerSession = this.connection.CreateSession(); 
    IMessageConsumer consumer = listenerSession.CreateConsumer(this.queue, "2 > 1"); 
    return new SimpleQueueListener(consumer, processor, listenerSession); 
}