1

MQにリクエストを送信し、MQからレスポンスを取得する通信クラスを作成しようとしています。

以下は私が書いたコードです。

TextMessage inputMsg = session.createTextMessage(message);
        inputMsg.setJMSReplyTo(responseQueue);
        try {

            connection.start();
            sender.send(inputMsg);
            messageId = inputMsg.getJMSMessageID();
            reciever = session.createConsumer(responseQueue,"JMSMessageID = '"+messageId+"'");
            Message mess=reciever.receive(10000);
            TextMessage outputMsg  = (TextMessage) mess;

            if(outputMsg == null)
                logger.error(" Error while recieving the message");
            else
                replyMsg= outputMsg.getText();

このコードは、コードが実行されるたびに次のオブジェクトを待機させます。

java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:167)
at com.ibm.mq.jmqi.remote.internal.system.RemoteProxyQueue.proxyMQGET(RemoteProxyQueue.java:2667)
at com.ibm.mq.jmqi.remote.internal.RemoteFAP.jmqiGetMessageWithRecon(RemoteFAP.java:6219)
at com.ibm.mq.jmqi.remote.internal.RemoteFAP.jmqiGetMessage(RemoteFAP.java:6112)
at com.ibm.mq.jmqi.internal.JmqiTools.getMessage(JmqiTools.java:1090)
at com.ibm.mq.jmqi.remote.internal.RemoteFAP.jmqiGet(RemoteFAP.java:6080)
at com.ibm.msg.client.wmq.internal.WMQConsumerShadow.getMsg(WMQConsumerShadow.java:1305)
at com.ibm.msg.client.wmq.internal.WMQSyncConsumerShadow.receiveInternal(WMQSyncConsumerShadow.java:239)
at com.ibm.msg.client.wmq.internal.WMQConsumerShadow.receive(WMQConsumerShadow.java:1058)
at com.ibm.msg.client.wmq.internal.WMQMessageConsumer.receive(WMQMessageConsumer.java:469)
at com.ibm.msg.client.jms.internal.JmsMessageConsumerImpl.receiveInboundMessage(JmsMessageConsumerImpl.java:879)
at com.ibm.msg.client.jms.internal.JmsMessageConsumerImpl.receive(JmsMessageConsumerImpl.java:431)
at com.ibm.mq.jms.MQMessageConsumer.receive(MQMessageConsumer.java:228)

しかし、createConsumer行をに変更すると、

reciever = session.createConsumer(responseQueue,"JMSMessageID = '"+messageId+"'");

上記の行の問題は、セッションの混乱につながる、より多くの同時リクエスト中に応答メッセージが混乱していることです。

誰かがこの問題を解決する方法を教えてもらえますか?

前もって感謝します。

4

1 に答える 1

1

コードに小さな問題があります。あなたのcreateConsumer呼び出しJMSMessageIDでは、セレクターとして使用されています。これJMSMessageIDは、実際に受信したい のメッセージ ID です。コードで以前に送信されたリクエスト メッセージのメッセージ ID ではありません。

JMSCorrelId呼び出しでは、代わりに を使用する必要がありJMSMessageIDますcreateConsumer

reciever = session.createConsumer(responseQueue,"JMSCorrelId = '"+messageId+"'");

次に、リクエスト メッセージを処理しているサーバー アプリケーションはJMSMessageID、リクエスト メッセージを取得してJMSCorrelIdフィールドに入力し、応答を送信する必要があります。このように、JMSCorrelIdリクエスト メッセージとレスポンス メッセージを使用すると、相互に関連付けられます。

于 2013-01-26T14:09:07.987 に答える