c# - IBM MQ XMS 订阅未关闭

标签 c# ibm-mq

我有一个应用程序,它使用 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/

相关文章:

ibm-mq - WebSphere MQ 和 IIB : Events potentially fill up the queue manager

java - 无法从 MQ 队列检索消息

c# - 字符串操作模式(C# 或其他语言)

C# LDAP 查询以获取特定组中用户的管理员

ibm-mq - 我应该何时重置我的 MQ channel ?

jms - 在 WMQ 中创建 JMS 主题发布者返回 2035 未授权

java - 如何获得现有的 JMS 队列?

c# - 如何将服务器服务连接到 Dynamics Online

c# - 网页浏览器站点 : how to call a private COM interface method in a derived class?

c# - Unity构建和运行游戏错误: Error building Player: Extracting referenced dlls failed