捕获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();
}
}
}