0

在我下面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){ 关闭(); 连接(); } }

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

`

4

1 回答 1

1

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

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

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

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

于 2012-12-01T02:53:50.790 回答