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个消费者连接到队列),因此消息丢失,因为它们仍然被触发到现在的重影连接。我想一个主题可能是答案,但必须有一个带有队列的解决方案?为什么不使用内置的故障切换协议,而不是尝试自己进行故障切换?