在我的下面的代码connect()
上,方法可以捕获2009年和2059年的例外情况。但是当我使用getMessage()
方法生成队列管理器或连接以生成2009或2059 MQ异常时,程序挂起或者没有抛出它。
它排队等候queue.get(retrievedMessage, getOptions);
。
如果连接或队列管理器坏了,我们是否需要添加额外的打开选项以使代码知道?
Connect() {`MQEnvironment.hostname = hostName; MQEnvironment.channel = channelName; MQEnvironment.port = portName; try { qMgr = new MQQueueManager(EvtqManager); // define a queue manager object LOGGER.debug("Queue Manager " +EvtqManager+ " Instance Initialized"); int openOptions = MQC.MQOO_INQUIRE + MQC.MQOO_FAIL_IF_QUIESCING+ MQC.MQOO_INPUT_SHARED; queue = qMgr.accessQueue(queueName, openOptions, null,null,null); LOGGER.debug("IBM MQQueue:"+queueName+" is accessed"); getOptions = new MQGetMessageOptions(); getOptions.options = MQC.MQGMO_NO_WAIT; getMessage(); } catch(){ if(MQex.reasonCode==2009 || MQex.reasonCode==2059){ shutDown(); Connect(); } }
getMessage(){ MQMessage retrievedMessage; while (true) { try { retrievedMessage = new MQMessage(); queue.get(retrievedMessage, getOptions); PCFMessage pcfMessage = new PCFMessage(retrievedMessage); } catch (MQException MQex) { if(MQex.reasonCode==2009 || MQex.reasonCode==2059){ shutDown(); Connect(); } } }
答案 0 :(得分:1)
无需其他选项。如果正在进行MQ方法调用并且与队列管理器的连接中断,则该方法将返回原因码2009或其他与连接错误相关的原因码。返回的原因代码取决于连接的断开方式,例如,如果队列管理器正在关闭,将返回MQRC_Q_MGR_QUIESCING / MQRC_Q_QMGR_STOPPING。
挂起可能是由于检测到套接字故障所花费的时间。因此,您可能需要检查呼叫等待的时间。
连接到队列管理器时返回MQRC 2059,但在接收消息时不返回。所以你可以删除2059年的支票。
我对你的代码感到困惑。您在shutdown()
和Connect()
方法中调用了Connect
和getMessage
。你认为这不会导致递归吗?