【问题标题】:ActiveMQ - multiple connections per session?ActiveMQ - 每个会话多个连接?
【发布时间】:2010-11-10 22:14:38
【问题描述】:

在 ActiveMQ 中,有人告诉我,提高吞吐量的最佳解决方案是拥有多个连接,每个连接都有自己的会话和使用者。

我一直在尝试使用 NMS(通过 C# 连接)来实现这一点,但在 MQ Web 控制台的“Active Consumwers”屏幕中,我看到所有连接和消费者都按照我的预期列出它们,但在下一列中,它们的 sessionId 都为“1”。我本来希望每个会话都有一个单独的会话 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);
}

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

【问题讨论】:

  • 你用的是什么版本的ActiveMQ和NMS?
  • 还有一个问题:您在创建 IConnectionFactory 时是否不小心设置了 Clientid ?我快速浏览了一下源代码,发现它被推送到了连接 ID,也可能是会话:s

标签: c# activemq


【解决方案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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    • 2017-09-18
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多