MQException:MQJE001:尝试从队列中检索消息时完成代码“2”,原因“2033”
MQException: MQJE001: Completion Code '2', Reason '2033' while trying to retreive a message from a queue
我尝试从队列中捕获消息。请注意,该消息具有 xml
内容。
但是,当消息被队列正确接收时,在块 catch (MQException e)
中抛出异常。
MQException: MQJE001: Completion Code '2', Reason '2033'
请查找以下使用的代码:
import com.ibm.mq.MQMessage
import com.ibm.mq.MQGetMessageOptions
import com.ibm.mq.MQQueueManager
import com.ibm.mq.constants.CMQC
import com.ibm.mq.headers.MQRFH2
import com.ibm.MQException
def mqProps = new Hashtable<String, Object>()
mqProps.put(MQConstants.CHANNEL_PROPERTY, 'mychannel')
mqProps.put(MQConstants.PORT_PROPERTY, myport)
mqProps.put(MQConstants.HOST_NAME_PROPERTY, 'myhost')
def qMgr = new MQQueueManager('myqueuemanager', mqProps)
def openOptions = MQConstants.MQOO_OUTPUT | MQConstants.MQOO_INPUT_AS_Q_DEF
def gmo = new MQGetMessageOptions()
gmo.options = CMQC.MQGMO_WAIT + CMQC.MQGMO_FAIL_IF_QUIESCING
def queue = qMgr.accessQueue('myqueue', openOptions)
MQMessage receiveMsg = null
boolean getMore = true
while(getMore) {
receiveMsg = new MQMessage()
try {
// get the message on the queue
queue.get(receiveMsg, gmo)
def rfh2 = new MQRFH2(receiveMsg)
def strucLen = rfh2.getStrucLength()
def encoding = rfh2.getEncoding()
def CCSID = rfh2.getCodedCharSetId()
def format = rfh2.getFormat()
def flags = rfh2.getFlags()
def nameValueCCSID = rfh2.getNameValueCCSID()
def b = new byte[receiveMsg.getDataLength()]
receiveMsg.readFully(b)
System.out.println("Data: " + new String(b))
queue.close()
} catch (MQException e) {
if (e.completionCode == CMQC.MQCC_FAILED && e.reasonCode == CMQC.MQRC_NO_MSG_AVAILABLE) {
// No message - loop again
}
else {
log.info("MQException: " + e.getLocalizedMessage())
log.info("CC=" + e.completionCode + " : RC=" + e.reasonCode)
getMore = false
}
} catch (IOException e) {
log.info("IOException:" + e.getLocalizedMessage())
}
}
你能帮我解决一下吗?谢谢。
def openOptions = MQConstants.MQOO_OUTPUT |
MQConstants.MQOO_INPUT_AS_Q_DEF
没有理由为输入和输出打开队列。另外,您应该包括 MQOO_FAIL_IF_QUIESCING.
def qMgr = new MQQueueManager('myqueuemanager', mqProps) def queue =
qMgr.accessQueue('myqueue', openOptions)
我强烈建议您使用大写、队列管理器和队列名称。此外,它还是一项 IBM 最佳实践。
queue.close()
应该在 finally 子句中调用 close 方法,否则可能会导致内存泄漏。
我多次向 Whosebug 发布 MQTEST12L.java(功能齐全)。您可以从 here 获取它。
以 MQTest12L 为例,说明如何正确编写 Java 应用程序代码以从队列中获取消息。
我尝试从队列中捕获消息。请注意,该消息具有 xml
内容。
但是,当消息被队列正确接收时,在块 catch (MQException e)
中抛出异常。
MQException: MQJE001: Completion Code '2', Reason '2033'
请查找以下使用的代码:
import com.ibm.mq.MQMessage
import com.ibm.mq.MQGetMessageOptions
import com.ibm.mq.MQQueueManager
import com.ibm.mq.constants.CMQC
import com.ibm.mq.headers.MQRFH2
import com.ibm.MQException
def mqProps = new Hashtable<String, Object>()
mqProps.put(MQConstants.CHANNEL_PROPERTY, 'mychannel')
mqProps.put(MQConstants.PORT_PROPERTY, myport)
mqProps.put(MQConstants.HOST_NAME_PROPERTY, 'myhost')
def qMgr = new MQQueueManager('myqueuemanager', mqProps)
def openOptions = MQConstants.MQOO_OUTPUT | MQConstants.MQOO_INPUT_AS_Q_DEF
def gmo = new MQGetMessageOptions()
gmo.options = CMQC.MQGMO_WAIT + CMQC.MQGMO_FAIL_IF_QUIESCING
def queue = qMgr.accessQueue('myqueue', openOptions)
MQMessage receiveMsg = null
boolean getMore = true
while(getMore) {
receiveMsg = new MQMessage()
try {
// get the message on the queue
queue.get(receiveMsg, gmo)
def rfh2 = new MQRFH2(receiveMsg)
def strucLen = rfh2.getStrucLength()
def encoding = rfh2.getEncoding()
def CCSID = rfh2.getCodedCharSetId()
def format = rfh2.getFormat()
def flags = rfh2.getFlags()
def nameValueCCSID = rfh2.getNameValueCCSID()
def b = new byte[receiveMsg.getDataLength()]
receiveMsg.readFully(b)
System.out.println("Data: " + new String(b))
queue.close()
} catch (MQException e) {
if (e.completionCode == CMQC.MQCC_FAILED && e.reasonCode == CMQC.MQRC_NO_MSG_AVAILABLE) {
// No message - loop again
}
else {
log.info("MQException: " + e.getLocalizedMessage())
log.info("CC=" + e.completionCode + " : RC=" + e.reasonCode)
getMore = false
}
} catch (IOException e) {
log.info("IOException:" + e.getLocalizedMessage())
}
}
你能帮我解决一下吗?谢谢。
def openOptions = MQConstants.MQOO_OUTPUT | MQConstants.MQOO_INPUT_AS_Q_DEF
没有理由为输入和输出打开队列。另外,您应该包括 MQOO_FAIL_IF_QUIESCING.
def qMgr = new MQQueueManager('myqueuemanager', mqProps) def queue = qMgr.accessQueue('myqueue', openOptions)
我强烈建议您使用大写、队列管理器和队列名称。此外,它还是一项 IBM 最佳实践。
queue.close()
应该在 finally 子句中调用 close 方法,否则可能会导致内存泄漏。
我多次向 Whosebug 发布 MQTEST12L.java(功能齐全)。您可以从 here 获取它。
以 MQTest12L 为例,说明如何正确编写 Java 应用程序代码以从队列中获取消息。