4

Java を使用して 1 回の 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ループを使用します。申し訳ありませんが、それについての少し卑劣な答えに抵抗することはできませんでした。selectWMQには、SQLステートメントに類似したAPI呼び出しはありません。メッセージングとデータベースはいくつかの特徴を共有していますが、根本的に異なる要件に対応しています。

10,000通のメッセージを閲覧するには長い時間がかかります。

PerformanceSupportPacsをご覧ください。これらはSupportPacsメインページで公開されており、名前はMPで始まります。プラットフォームとMQバージョン用のものを見つけてください。メッセージを配置および取得するためのさまざまなシナリオと、パフォーマンス調整の推奨事項が一覧表示されます。

また、通常のアプリが10,000件のメッセージを閲覧する必要がある理由も尋ねます。QMgrは、MsgID、相関ID、またはプロパティに基づいてメッセージを選択します。これは、アプリケーションが目的のメッセージを見つけるためにすべてのメッセージを参照するよりもはるかに高速です。キューをアーカイブしたり、問題をデバッグしたりするために、キュー上のすべてのメッセージを参照する必要がある場合がありますが、これは規則ではなく例外です。本番アプリがキュー上のすべてのメッセージを定期的に参照している場合は、キューがデータベースとして不適切に使用されている可能性があります。

于 2012-11-11T15:56:15.293 に答える
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 に答える
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 に答える
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 に答える