4

我们如何使用 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

4 回答 4

2

如何在不使用 for 循环的情况下获取所有消息?

使用while循环。抱歉,无法抗拒对此的略带尖刻的回答。WMQ 没有类似于 SQLselect语句的 API 调用。消息传递和数据库具有一些共同特征,但满足根本不同的需求。

浏览 10,000 条消息需要很长时间。

看看性能支持包。它们发布在SupportPacs 主页上,名称以 MP 开头。找到适合您的平台和 MQ 版本的那个,它将列出放置和获取消息的不同场景以及性能调整建议。

我还会问为什么一个普通的应用程序需要浏览 10,000 条消息。QMgr 将根据 MsgID、Correlation ID 或属性为您选择消息,这比浏览所有消息以让应用程序找到感兴趣的消息要快得多。有时人们需要浏览队列中的所有消息以归档队列或调试问题,但这是例外而不是规则。如果生产应用程序定期浏览队列中的所有消息,则队列可能被不恰当地用作数据库。

于 2012-11-11T15:56:15.293 回答
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());

            }
        }
}
...
于 2013-03-01T14:42:27.003 回答
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

于 2012-11-12T19:08:45.140 回答
0

刚刚注意到您正在使用的消息格式(out.Format)。MQFMT_XMIT_Q_HEADER 用于发送到传输队列的消息。传输队列中的消息通常不会被应用程序读取。MQ 使用传输队列将消息从一个队列管理器发送到 MQ 网络中的另一个队列管理器。我希望您没有浏览传输队列中的消息。

对于应用程序,消息格式通常取决于接收应用程序。例如,如果接收应用程序基于 CICS,则格式为 MQFMT_CICS,对于 IMS,格式为 MQFMT_IMS。如果需要文本/字符串类型的数据,那么您可以使用 MQFMT_STRING。对于使用 PCF 消息管理 MQ,格式可以是 MQFMT_PCF。

于 2012-11-12T06:22:43.153 回答