Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有ClientId的ActiveMq连接引发错误_C#_.net_Activemq_Messaging - Fatal编程技术网

C# 具有ClientId的ActiveMq连接引发错误

C# 具有ClientId的ActiveMq连接引发错误,c#,.net,activemq,messaging,C#,.net,Activemq,Messaging,我有以下代码: _connectionFactory = new Apache.NMS.ActiveMQ.ConnectionFactory(_activeMqSettings.Connection.ServerUrl, "MyApplication"); _connection = _connectionFactory.CreateConnection(_activeMqSettings.Connection.UserName, _activeMqSettings.Connection.Pas

我有以下代码:

_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:0:1:39932

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

当我关闭网站然后重新启动它时,我可以看到连接会随着
\u connection\u ConnectionResumedListener()
的触发而恢复。然而,我的听众没有收到任何新消息

是否仍要获取会话句柄并刷新侦听器,即重新运行:

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

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


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

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


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

谢谢你,蒂姆。那么,对于使用队列的网站,您有什么建议?当站点恢复时出现故障(IIS重置、升级、断电等),它将获得一个新会话。代理仍然认为旧的连接是有效的(我可以看到2个消费者连接到队列),因此消息丢失,因为它们仍然被触发到现在的重影连接。我想一个主题可能是答案,但必须有一个带有队列的解决方案?为什么不使用内置的故障切换协议,而不是尝试自己进行故障切换?谢谢Tim。那么,对于使用队列的网站,您有什么建议?当站点恢复时出现故障(IIS重置、升级、断电等),它将获得一个新会话。代理仍然认为旧的连接是有效的(我可以看到2个消费者连接到队列),因此消息丢失,因为它们仍然被触发到现在的重影连接。我想一个主题可能是答案,但必须有一个带有队列的解决方案?为什么不使用内置的故障切换协议,而不是尝试自己进行故障切换?