我有一个应用程序,它使用WebSphere MQ通过WebSphere将数据发送到云中的数据中心。部分功能是,如果服务器端订户检测到30分钟未收到消息,则线程暂停5分钟,并删除连接。当它重新启动时,它会重新连接。
在实践中,我发现断开连接并未删除订阅。尝试重新连接时,我看到了这个错误:
“由于其他消息使用者正在使用该订阅,因此可能存在创建订阅的问题。 在尝试使用相同名称创建新订阅之前,请确保使用此订阅的任何消息使用者都已关闭。有关详细信息,请参阅链接的例外。“
这表明消息处理程序仍然连接,这意味着断开连接失败。断开XmsClient对象的代码(库的一部分,虽然我的一个同事可能已经改变了它):
public override void Disconnect()
{
_producer.Close();
_producer.Dispose();
_producer = null;
_consumer.MessageListener = null;
_consumer.Close();
_consumer.Dispose();
_consumer = null;
_sessionRead.Close();
_sessionRead.Dispose();
_sessionRead = null;
_sessionWrite.Close();
_sessionWrite.Dispose();
_sessionWrite = null;
_connection.Stop();
_connection.Close();
_connection.Dispose();
_connection = null;
//GC.Collect();
IsConnected = false;
}
任何人都有任何想法为什么连接仍然存在?
答案 0 :(得分:3)
从错误描述看,服务器订阅者正在创建持久订阅。即使订阅应用程序未运行,持久订阅仍会继续接收消息。要删除持久订阅,您必须调用Session.Unsubscribe()。简单地关闭消费者不会删除订阅。
如果您打算在不删除订阅的情况下关闭订阅者,请先发出Connection.Stop(),然后取消注册消息侦听器,然后关闭使用者。调用connection.Stop方法会停止邮件传递。