2010-08-20 4 views
0

В рамках ActiveMQ мне сказали, что наиболее оптимальным решением для увеличения пропускной способности является наличие нескольких соединений, каждый со своим сеансом и потребителем.ActiveMQ - несколько соединений за сеанс?

Я пытался добиться этого с помощью NMS (подключение через C#), но на экране «Активные пользователи» веб-консоли MQ я вижу все мои подключения & потребителей, перечисленных, как я ожидал см. их, но в следующем столбце у всех их есть sessionId из «1». Я бы ожидал, что для каждого будет отдельный идентификатор сеанса.

Это право? И если для каждого соединения/потребителя должны быть разные идентификаторы сеансов, как бы я мог обеспечить, чтобы эти дополнительные сеансы были созданы?

Вот пример кода, я использую, чтобы начать новое соединение (это основано на 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); 
} 

... и это делается каждый раз, когда для каждого из соединений I'M открытие.

+0

Какую версию ActiveMQ и NMS вы используете? – Noctris

+0

И еще один вопрос: Вы случайно установили ClientID при создании IConnectionFactory? я быстро заглянул в исходный код и заметил, что это нажало на идентификатор соединения и, возможно, на сеанс: s – Noctris

ответ

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); 
} 
Смежные вопросы