与ClientId抛出错误的ActiveMq连接

时间:2013-11-26 16:59:40

标签: c# .net activemq messaging

我有以下代码:

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

1 个答案:

答案 0 :(得分:1)

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

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