【问题标题】:IBM WebSpher MQ Queue.Get() call hangs forever in case of loss in connectivity如果连接丢失,IBM WebSphere MQ Queue.Get() 调用将永远挂起
【发布时间】:2017-12-19 13:03:51
【问题描述】:

我在使用 C# 的 .NET 应用程序中使用 IBM MQ 版本 8.0.0.0。现在我正在尝试从队列中读取消息。我正在使用下面的代码从队列中读取消息。

.....

Hashtable props = new Hashtable();
            props.Add(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_MANAGED);
            props.Add(MQC.CONNECT_OPTIONS_PROPERTY, MQC.MQCNO_RECONNECT_Q_MGR);    // Reconnect option

openOptions = MQC.MQOO_INPUT_SHARED | MQC.MQOO_FAIL_IF_QUIESCING;

queueManager = new MQQueueManager(queueManagerName, props);

this.queue = queueManager.AccessQueue(queueName, openOptions);

....

MQGetMessageOptions gmo = new MQGetMessageOptions();
            gmo.Options = MQC.MQGMO_FAIL_IF_QUIESCING
                | MQC.MQGMO_WAIT | MQC.MQGMO_SYNCPOINT;

            gmo.MatchOptions = MQC.MQMO_NONE;
            gmo.WaitInterval = 5000;     // I'm specifying this

var message = new MQMessage();
this.queue.Get(message, gmo);        // Waits here forever in case connection is lost to IBM MQ.

.........

.........

现在,如果与 MQ 服务器的连接丢失 AFTER 连接已建立,但 BEFORE 发出了 queue.Get() 调用,我会看到 .GET() 调用会永远等待并且尽管指定了 WAIT_INTERVAL 并不会停止。

另外,我观察到,一旦连接恢复,.Get() 调用会立即返回,并带有从队列中读取的消息。

我是不是做错了什么?

编辑: 添加了带有属性的 queueManager 创建代码,其中之一指示客户端在可能的情况下重新连接到同一个队列管理器。

【问题讨论】:

    标签: ibm-mq


    【解决方案1】:

    从这个观察:

    另外,我观察到,一旦连接恢复,.Get() 调用会立即返回,并带有从队列中读取的消息。

    在进行 GET 调用时,与队列管理器的连接丢失。因此 MQ .NET 客户端正在尝试重新连接到队列管理器。在进行重新连接尝试时,应用程序会发现方法调用“挂起”。这个是正常的。所以问题是您是否在您的应用程序中启用了自动重新连接?显示完整代码。

    更新 这是一种预期行为,因为 Get 调用在内部尝试重新连接到队列管理器。你可以:

    1) 减少 mqclient.ini 文件中的重新连接超时。下面是一个例子。

    Channels:
    MQReconnectTimeout = 100
    

    2) 检查队列管理器关闭的原因并启动它。

    【讨论】:

    • 是的,我已启用它。我已经用队列管理器创建代码更新了这个问题,我已经给出了重新连接的指令。如果需要更多信息,请告诉我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多