【问题标题】:ActiveMq connection with ClientId throwing error带有 ClientId 的 ActiveMq 连接抛出错误
【发布时间】:2013-12-11 23:10:06
【问题描述】:

我有以下代码:

_connectionFactory = new Apache.NMS.ActiveMQ.ConnectionFactory(_activeMqSettings.Connection.ServerUrl, "MyApplication");
_connection = _connectionFactory.CreateConnection(_activeMqSettings.Connection.UserName, _activeMqSettings.Connection.Password);
_connection.ConnectionInterruptedListener += _connection_ConnectionInterruptedListener;
_connection.ConnectionResumedListener += _connection_ConnectionResumedListener;
_session = _connection.CreateSession();

第一次连接成功,但后续连接抛出错误:

代理:本地主机 - 客户端:MyApplication 已从 tcp://0:0:0:0:0:0:0:1:39932

此代码在没有客户端 ID 的情况下可以正常工作,但会引发错误。我的印象是,给 ClientId 会重新连接到代理而不创建新会话(因此消费者计数保持不变),但我是否执行不正确?

当我关闭网站然后重新启动它时,我可以看到连接在_connection_ConnectionResumedListener() 触发时恢复。但是,我的听众没有收到任何新消息。

无论如何要获取会话句柄,并刷新侦听器,即重新运行:

lock (ConsumerLocker)
{
   if (_consumer == null)
   {
        _consumer = _session.CreateConsumer(new ActiveMQTopic(_activeMqSettings.Queues.OpsConsole));
        _consumer.Listener += new MessageListener(messageReader);
   }
 }

【问题讨论】:

    标签: c# .net activemq messaging


    【解决方案1】:

    您在代码中所做的工作并不完全清楚,但我可以澄清客户端 ID 位。如果您打算设置该字段,则需要为每个连接分配它自己的唯一客户端 ID。在与该客户端 ID 进行初始连接之后,使用相同客户端 ID 进行的任何连接尝试都将失败,直到通过调用 connection.Close() 关闭原始连接。

    客户端 ID 通常用于将具有与之关联的持久主题订阅的连接。每个连接必须有一个唯一的客户端 ID,以便他们可以恢复与该连接关联的持久订阅,如果允许多个连接具有相同的客户端 ID,代理无法确定谁的订阅是谁的。

    【讨论】:

    • 谢谢蒂姆。那么对于使用队列的网站,您有什么建议?当站点在重新启动时出现故障(IIS 重置、升级、断电等)时,它会获得一个新会话。代理仍然认为旧连接是有效的(我可以看到 2 个消费者附加到队列),因此消息会丢失,因为它们仍然会被触发到现在的幻影连接。我想一个主题可能是答案,但必须有一个队列的解决方案?
    • 为什么不使用内置的故障转移协议而不是尝试自己进行故障转移?
    猜你喜欢
    • 2017-07-30
    • 2015-08-26
    • 2021-07-17
    • 2021-09-27
    • 2017-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多