【问题标题】:java code to catch mqrc 2009 and 2059 errors捕获 mqrc 2009 和 2059 错误的 java 代码
【发布时间】:2012-11-30 06:02:18
【问题描述】:

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

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

连接()
{

MQEnvironment.hostname = 主机名; MQEnvironment.channel = 通道名称; MQEnvironment.port = 端口名称; 尝试 { qMgr = 新 MQQueueManager(EvtqManager); // 定义一个队列管理器对象 LOGGER.debug("队列管理器 " +EvtqManager+ " 实例初始化"); 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+"被访问"); getOptions = 新 MQGetMessageOptions(); getOptions.options = MQC.MQGMO_NO_WAIT; 获取消息(); } 抓住(){ 如果(MQex.reasonCode==2009 || MQex.reasonCode==2059){ 关闭(); 连接(); } }

getMessage(){ MQMessage 检索消息; 而(真){ 尝试 { 检索消息 = 新 MQMessage(); queue.get(retrivedMessage, getOptions); PCFMessage pcfMessage = new PCFMessage(retrivedMessage); } 捕捉(MQException MQex){ 如果(MQex.reasonCode==2009 || MQex.reasonCode==2059){ 关闭(); 连接(); } } }

`

【问题讨论】:

  • @Vignesh:我也在寻找一种解决方案,它可以帮助我了解在建立连接时队列是否因维护或任何其他问题而关闭。我们的队列也在大型机上。请告知! !

标签: java ibm-mq


【解决方案1】:

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

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

MQRC 2059 在连接到队列管理器时返回,但在接收消息时不返回。所以你可以去掉 2059 的支票。

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

【讨论】:

  • 谢谢Shashi。请忽略对Connect() 和shutdown() 的递归调用,我这里只有我的部分代码。实际上我正在从网络断开并重新连接我的PC 以测试我的重新连接逻辑。重新连接在我的代码的其他部分工作,但它只挂在“queue.get(retrivedMessage, getOptions);”上。你是对的,但它无限期地等待,此时它永远不会抛出异常。如何让它知道连接断开或队列管理器关闭?
  • 不,你不需要任何额外的东西。应自动抛出连接中断错误。您是通过拉网线进行测试,还是通过运行 endmqm 结束队列管理器?还使用什么版本的 MQ?让我不解的是,你使用的是 MQGMO_NO_WAIT,所以无论有没有消息,调用都应该立即返回。
  • 我正在通过关闭网络进行测试。我正在连接到 MQv7 队列管理器。是的,我设置了“MQC.MQGMO_NO_WAIT”选项,并且在我的 catch 块中处理 mqrc 2033,但不包括在此处。
  • 不太清楚你的情况。您还可以编写一个从远程服务器读取套接字的小型示例应用程序。当应用程序在套接字上等待时,您关闭网络并查看会发生什么。顺便说一句,您的队列管理器是在同一个系统上还是在不同的系统上运行?
  • 队列管理器在不同的系统上运行,它在大型机上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-27
  • 2012-06-29
  • 2012-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多