我有以下代码:
_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();
第一个连接成功,但后续连接会抛出错误:
代理:localhost - 客户端: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);
}
}
答案 0 :(得分:1)
您在代码中所做的事情并不完全清楚,但我可以澄清客户端ID位。如果您打算设置该字段,则需要为每个连接分配它自己的唯一客户端ID。在与该客户端Id初始连接之后使用相同客户端ID的任何连接尝试都将失败,直到通过调用connection.Close()关闭原始连接。
客户端ID通常用于将要与之关联的持久主题订阅的Connection。每个连接必须具有唯一的客户端ID,以便他们可以恢复与Connection关联的持久订阅,如果允许多个Connection具有相同的客户端ID,则代理无法确定哪个订阅是谁的。