0

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

我阅读它的方式,开发人员做了三个假设:

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

我期望的是在状态 isConnected() == true 下创建 MQQueueManager 实例,该状态可能会在以后更改(网络故障等),并且此状态更改(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;
4

1 回答 1

0

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

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

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

于 2013-10-10T13:12:31.333 回答