我有一个应用程序,它使用 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;
}
有人对为什么连接仍然存在有任何想法吗?
最佳答案
从错误描述来看,服务器订阅者正在创建持久订阅。即使订阅应用程序未运行,持久订阅也会继续接收消息。要删除持久订阅,您必须调用 Session.Unsubscribe()。简单地关闭消费者并不会删除订阅。
如果您的目的是关闭订阅者而不删除订阅,则首先发出 Connection.Stop(),然后取消注册消息监听器,然后关闭使用者。调用connection.Stop方法停止消息传递。
关于c# - IBM MQ XMS 订阅未关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12508473/