【问题标题】:MQQueueManager: What to expect from isConnected state after creation, during use?MQQueueManager:isConnected 状态在创建后、使用期间会发生什么?
【发布时间】:2013-10-10 21:37:30
【问题描述】:

我继承了下面这段可爱的代码。

按照我的阅读方式,开发者做了三个假设:

  1. MQQueueManager 实例不一定在 isConnected() 返回 true 的状态下创建
  2. 如果它是在 isConnected() == false 状态下创建的,则状态可能会“稍后”更改,因此会出现超时代码
  3. 如果您尝试从断开连接的 MQQueueManager 创建访问队列,它不会抛出异常。

我希望 MQQueueManager 实例在 isConnected() == true 状态下创建,此状态可能会在稍后更改(网络故障等),并且此状态更改(isConnected() == false)会导致队列上的操作失败并出现 MQException。

文档对这些点保持沉默,但要注意在手动断开 MQQueueManager 后重新连接到队列的唯一方法是创建一个新的 MQQueueManager 实例。

谁能帮我直截了当?

qMgr = new MQQueueManager( qManager );

// Set up the options on the queue we wish to open...
// Note. All WebSphere MQ Options are prefixed with MQC in Java.
final int openOptions = MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_OUTPUT;

// Now specify the queue that we wish to open,
// and the open options...
queue = qMgr.accessQueue( queueName, openOptions );

// Set the get message options...
final MQGetMessageOptions gmo = new MQGetMessageOptions(); // accept the
// defaults
gmo.options = MQC.MQGMO_WAIT;
gmo.waitInterval = 1000;


connectionStatus = CONNECTING;
int timeOutCounter = 0;
while(!qMgr.isConnected()) {
    InboundMsgTask.sleep(1000);
    timeOutCounter++;
    if(timeOutCounter > 4) {
        connectionStatus = TIME_OUT;
        return;
    }
}
connectionStatus = CONNECTED;

【问题讨论】:

    标签: ibm-mq


    【解决方案1】:

    与其检查IsConnected==True,不如继续进行实际的MQ .NET 方法调用(Get, Put 等)。如果连接断开,这些调用将引发连接断开的执行 (MQRC 2009)。请记住,在调用 MQ 方法之前,IsConnected 可能是 True,但在执行 MQ 方法期间它可能会发生变化。您的代码需要处理连接中断异常并调用MQQueueManager.Disconnect 方法,然后重新建立连接。 Disconnect 调用将释放所有分配的资源并优雅地关闭所有打开的队列管理器对象。忽略Disconnect 方法抛出的任何异常。

    如果您使用的是 MQ v7.1 或 v7.5,则 .NET 客户端在检测到连接错误时可以自动重新连接到队列管理器。您将需要启用自动重新连接选项。请参阅 MQ 信息中心。

    编辑: 如果与队列管理器的连接成功建立,new MQQueueManager() 将返回 MQQueueManager 类的实例。如果出现错误,将抛出 MQException。无需等待连接完成,因为MQQueueManager 构造函数是一个阻塞调用。

    【讨论】:

    • 谢谢。但这并不能回答我的部分问题,基本上是“= newMQConnectionManager(name) 将返回一个作为连接的 MQConnectionManager,还是有时需要等待连接完成”。或者更直接:新的 MQConnectionManager 调用是否在连接建立之前阻塞?
    • 谢谢!我已经接受了答案。如果您有参考,那就太好了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-17
    • 1970-01-01
    • 1970-01-01
    • 2011-08-15
    • 1970-01-01
    • 2011-05-31
    相关资源
    最近更新 更多