ActiveMQ - несколько подключений за сеанс?

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

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

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

Вот пример кода, который я использую для запуска нового соединения (это основано на Примечания кода введения транзакционных сообщений ActiveMQ):

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

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


person rvxnet    schedule 20.08.2010    source источник
comment
какую версию ActiveMQ и NMS вы используете?   -  person Noctris    schedule 16.09.2010
comment
И еще вопрос: вы случайно установили Clientid при создании IConnectionFactory? я быстро заглянул в исходный код и заметил, что это перенесено на идентификатор соединения и, возможно, на сеанс: s   -  person Noctris    schedule 16.09.2010


Ответы (1)


Похоже, этот фрагмент кода является корнем моей проблемы:

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);
}
person rvxnet    schedule 10.11.2010