捕获mqrc 2009和2059错误的java代码

捕获mqrc 2009和2059错误的java代码,java,ibm-mq,Java,Ibm Mq,在我下面的代码中,connect()方法能够捕获2009和2059异常。但当我在getMessage()方法中关闭队列管理器或连接以生成2009或2059 MQ异常时,程序挂起或没有抛出它。 它正在队列queue.get(retrievedMessage,getOptions)中等待 如果连接或队列管理器断开,我们是否需要添加额外的打开选项以使代码知道 连接() { MQEnvironment.hostname=主机名; MQEnvironment.channel=channelName; MQ

在我下面的代码中,
connect()
方法能够捕获2009和2059异常。但当我在
getMessage()
方法中关闭队列管理器或连接以生成2009或2059 MQ异常时,程序挂起或没有抛出它。 它正在队列
queue.get(retrievedMessage,getOptions)中等待

如果连接或队列管理器断开,我们是否需要添加额外的打开选项以使代码知道

连接() {

MQEnvironment.hostname=主机名; MQEnvironment.channel=channelName; MQEnvironment.port=portName; 尝试 { qMgr=newMQQueueManager(EvtqManager);//定义队列管理器对象 debug(“队列管理器”+EvtqManager+“实例已初始化”); int openOptions=MQC.MQOO\u INQUIRE+MQC.MQOO\u FAIL\u IF\u QUIESCING+MQC.MQOO\u INPUT\u SHARED; queue=qMgr.accessQueue(queueName,openOptions,null,null); debug(“访问IBM MQQueue:+queueName+”); getOptions=新的MQGetMessageOptions(); getOptions.options=MQC.MQGMO_NO_WAIT; getMessage(); } 捕获(){ 如果(MQex.reasonCode==2009 | | MQex.reasonCode==2059){ 关机(); Connect(); } }

getMessage(){ MQMessageRetrievedMessage; while(true){ 试一试{ retrievedMessage=新MQMessage(); 获取(retrievedMessage、getOptions); PCFMessage PCFMessage=新的PCFMessage(retrievedMessage); } 捕获(MQException MQex){ 如果(MQex.reasonCode==2009 | | MQex.reasonCode==2059){ 关机(); Connect(); } } }


`

不需要其他选项。如果MQ方法调用正在进行且与队列管理器的连接中断,则该方法将返回原因码2009或其他与连接错误相关的原因码。返回的原因码将取决于连接中断的方式,例如MQRC_Q_MGR_QUIESCING/MQRC_Q_QMGR_STOPPING如果正在关闭队列管理器,将返回

挂起可能是由于检测套接字故障所花费的时间。因此,您可能需要检查呼叫等待的时间

MQRC 2059在连接到队列管理器时返回,但在接收消息时不返回。因此,您可以删除对2059的检查


我只是对你的代码有点困惑。你在
Connect
getMessage
方法中调用了
shutdown()
Connect()
方法。你不认为这会导致递归吗?

谢谢Shashi。请忽略Connect()和shutdown()上的递归调用,我这里只有一部分代码..实际上我正在断开并重新连接我的电脑与网络,以测试我的重新连接逻辑。重新连接在我代码的其他部分工作,但它仅挂起在“queue.get(retrievedMessage,getOptions);”。您是对的,但它正在无限期地等待,并且在这一点上不会引发异常。如何让它知道连接已断开或队列管理器已关闭?不,您不需要额外的操作。连接已断开的错误应自动引发。您是通过拉网络电缆进行测试,还是通过运行endmqm结束队列管理器进行测试?还有您使用的是什么版本的MQ?让我困惑的是,您使用的是MQGMO_NO_WAIT,因此如果有消息或没有消息,调用应该立即返回。我正在通过关闭网络进行测试。我正在连接到MQv7队列管理器。是的,我有“MQC.MQGMO_NO_WAIT”选项集,我正在catch块中处理mqrc 2033,但不包括在这里。不太确定您的情况如何。您也可以编写一个小示例应用程序,从远程服务器读取套接字。当应用程序等待套接字时,您可以打开网络,看看会发生什么。顺便说一句,您的队列管理器位于同一系统上或者在不同的系统上运行?队列管理器在不同的系统上运行,它在大型机上。@Vignesh:我也在寻找一种解决方案,可以帮助我知道队列是否在进行维护或连接时出现任何其他问题。我们的队列也在大型机上。请提供建议!!! 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(); } } }