我正在尝试从MQ队列中检索消息。以下是我正在使用的代码:
//Fetching Queue details
MQEnvironment.hostname=getMqCall().getMqHost();
MQEnvironment.channel=getMqCall().getMqChannel();
MQEnvironment.port=getMqCall().getMqPort();
MQQueueManager qMgr= new MQQueueManager(getMqCall().getMqQueManager());
MQQueue outputQueue = qMgr.accessQueue(getMqCall().getRespQueue(), MQC.MQOO_INQUIRE | MQC.MQOO_BROWSE | MQC.MQOO_INPUT_AS_Q_DEF);
//Checking for messages in queue
int i=outputQueue.getCurrentDepth();
System.out.println("Number of messages in Assign promo queue:: "+i);
for(int j=0;j<i;j++){
MQMessage sampleResponse = new MQMessage();
MQGetMessageOptions gmo = new MQGetMessageOptions();
outputQueue.get(sampleResponse, gmo);
String msgtext = sampleResponse.readStringOfCharLength(sampleResponse.getMessageLength());
System.out.println("Message read is: "+msgtext);
System.out.println("Response length: "+sampleResponse.getTotalMessageLength());
if(msgtext!=null){
// Some code
}else{
System.out.println("Message not read from response queue");
}
}
//Checking for messages in queue after processing
i=outputQueue.getCurrentDepth();
System.out.println("Number of messages in queue after processing :: "+i);
outputQueue.close();
qMgr.close();
qMgr.disconnect();
我将msgtext值视为null,即使getCurrentDepth()
向我显示队列中存在值。即使getTotalMessageLength()
返回null
值也是如此。已验证该队列中是否存在消息。
之前我使用readString()
方法代替readStringOfCharLength()
。但是,我仍然没有收到回复,所以我使用readStringOfCharLength()
进行了检查,因为readString()
方法已被弃用。
我甚至尝试使用readLine()
方法,但仍然无法检索消息。
提前致谢。
PS:我通过一个每15分钟运行一次的调度程序来运行上面的代码。
答案 0 :(得分:2)
永远不要根据队列的当前深度设置循环。有许多理由从未这样做,并且在IBM的MQ标准文档中有记录。
其次,确保捕获MQ抛出的MQExceptions。否则,您将发布消息说&#34;其中&#39; s我的消息&#34;。 MQException最重要的是原因代码。 MQ知识中心中记录了所有MQ原因代码。为链接添加书签并用于查找原因代码。
最后,这是一个结构合理的Java / MQ程序:
private void testReceive()
{
int openOptions = CMQC.MQOO_INQUIRE + CMQC.MQOO_INPUT_SHARED + CMQC.MQOO_FAIL_IF_QUIESCING;
MQGetMessageOptions getOptions = new MQGetMessageOptions();
getOptions.options = CMQC.MQGMO_NO_WAIT + CMQC.MQGMO_FAIL_IF_QUIESCING;
boolean getMore = true;
MQQueueManager qMgr = null;
MQQueue queue = null;
MQMessage receiveMsg = null;
try
{
qMgr = new MQQueueManager(qManager);
queue = qMgr.accessQueue(inputQName, openOptions);
while(getMore)
{
try
{
receiveMsg = new MQMessage();
queue.get(receiveMsg, getOptions);
byte[] b = new byte[receiveMsg.getMessageLength()];
receiveMsg.readFully(b);
System.out.println("Message-->" + new String(b));
}
catch (MQException e)
{
if ( (e.completionCode == CMQC.MQCC_WARNING) &&
(e.reasonCode == CMQC.MQRC_NO_MSG_AVAILABLE) )
{
System.out.println("Bottom of the queue reached.");
getMore = false;
}
else
{
System.err.println("MQRead CC=" +e.completionCode + " : RC=" + e.reasonCode);
getMore = false;
}
}
catch (IOException e)
{
System.out.println("MQRead " +e.getLocalizedMessage());
}
}
}
catch (MQException e)
{
System.err.println("MQRead CC=" +e.completionCode + " : RC=" + e.reasonCode);
}
finally
{
try
{
if (queue != null)
queue.close();
}
catch (MQException e)
{
System.err.println("MQRead CC=" +e.completionCode + " : RC=" + e.reasonCode);
}
try
{
if (qMgr != null)
qMgr.disconnect();
}
catch (MQException e)
{
System.err.println("MQRead CC=" +e.completionCode + " : RC=" + e.reasonCode);
}
}
}