2010-08-20 99 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); 
}