2

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

有人对为什么连接仍然存在有任何想法吗?

4

1 回答 1

2

从错误描述看来,服务器订阅者正在创建持久订阅。即使订阅应用程序未运行,持久订阅也会继续接收消息。要删除持久订阅,您必须调用 Session.Unsubscribe()。简单地关闭消费者并不会删除订阅。

如果您的意图是在不删除订阅的情况下关闭订阅者,则首先发出 Connection.Stop() ,然后取消注册消息侦听器,然后关闭使用者。调用 connection.Stop 方法停止消息传递。

于 2012-09-20T08:48:05.747 回答