如何使用java在一个API调用中浏览WebSphere MQ队列中的所有消息?
这是我正在使用的代码。在这里,我使用此代码for
循环,直到达到q深度。
MQGetMessageOptions gmo=new MQGetMessageOptions();
gmo.options = MQC.MQGMO_WAIT | MQC.MQGMO_BROWSE_NEXT ;
//System.out.println("Status: "+i);
MQMessage out=new MQMessage();
out.format =MQC.MQFMT_XMIT_Q_HEADER;//MQC.MQFMT_REF_MSG_HEADER;
mqCon.getQue().get(out,gmo);
System.out.print(i);
如何在不使用for
循环的情况下获取所有消息?浏览10,000条消息需要很长时间。
答案 0 :(得分:2)
如何在不使用for循环的情况下获取所有消息?
使用while
循环。对不起,无法抗拒那个问题上有点讽刺的回答。 WMQ没有类似于SQL select
语句的API调用。消息传递和数据库共享一些特征,但解决了根本不同的要求。
浏览10,000条消息需要很长时间。
查看Performance SupportPacs。这些发布在SupportPacs main page上,名称以MP开头。找到适合您的平台和MQ版本的版本,它将列出放置和获取消息的不同方案以及性能调整建议。
我还会问为什么普通应用需要浏览10,000条消息。 QMgr将根据MsgID,关联ID或属性为您选择消息,这比浏览所有消息更快 ,以便应用程序找到感兴趣的消息。有时,人们需要浏览队列中的所有消息以存档队列或调试问题,但这是例外而不是规则。如果Production应用程序定期浏览队列中的所有消息,则队列可能不适当地用作数据库。
答案 1 :(得分:1)
如何在不使用for循环的情况下获取所有消息?
MQGetMessageOptions getOptions = new MQGetMessageOptions();
getOptions.options = MQC.MQGMO_BROWSE_NEXT + MQC.MQGMO_NO_WAIT + MQC.MQGMO_FAIL_IF_QUIESCING;
MQMessage message = new MQMessage();
byte[] b = null;
while(true)
{
try
{
queue.get(message, getOptions);
b = new byte[message.getMessageLength()];
message.readFully(b);
System.out.println(new String(b));
message.clearMessage();
}
catch (IOException e)
{
System.out.println("IOException: " + e.getMessage());
break;
}
catch (MQException e)
{
if (e.completionCode == 2 && e.reasonCode == MQException.MQRC_NO_MSG_AVAILABLE)
System.out.println("All messages read.");
else
System.out.println("MQException: Completion Code = " + e.completionCode + " : Reason Code = " + e.reasonCode);
break;
}
}
我在这里发布了许多Java / MQ示例: http://www.capitalware.biz/mq_code_java.html
答案 2 :(得分:1)
如果您只想浏览消息(不检索它们),可以使用javax.jms.QueueBrowser。 很快......
import javax.jms.*
...
public ArrayList<Message> browse() {
...
QueueBrowser queueBrowser = queueSession.createBrowser((javax.jms.Queue) lookupQueue());
Enumeration enums = queueBrowser.getEnumeration();
while (enums.hasMoreElements()) {
Object objMsg = enums.nextElement();
if (objMsg instanceof TextMessage) {
TextMessage message = (TextMessage) objMsg;
Log4j.trace("Text message: " + i + ". MSG:" + message.getText() + " MSG id:"
+ message.getJMSMessageID() + " MSG dest:" + message.getJMSDestination());
} else if (objMsg instanceof ObjectMessage) {
ObjectMessage message = (ObjectMessage) objMsg;
Log4j.trace("Object Message: " + i + ". MSG" + " MSG id:" + message.getJMSMessageID()
+ " MSG dest:" + message.getJMSDestination());
}
}
}
...
答案 3 :(得分:0)
注意到您正在使用的邮件格式(out.Format)。 MQFMT_XMIT_Q_HEADER用于发送到传输队列的消息。传输队列中的消息通常不会被应用程序读取。 MQ使用传输队列将消息从一个队列管理器发送到MQ网络中的另一个队列管理器。我希望你不要在传输队列中浏览消息。
对于应用程序,消息格式通常取决于接收应用程序。例如,如果接收应用程序是基于CICS的,那么格式将是MQFMT_CICS,对于IMS,它将是MQFMT_IMS。如果需要文本/字符串类型的数据,那么您可以使用MQFMT_STRING。要使用PCF消息管理MQ,则格式可以是MQFMT_PCF。