使用Java一次浏览来自WebSphere MQ的所有消息

时间:2012-11-11 15:35:55

标签: ibm-mq

如何使用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条消息需要很长时间。

4 个答案:

答案 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。