基于JMS消息选择器的MessageConsumer.recieve正在使对象等待

基于JMS消息选择器的MessageConsumer.recieve正在使对象等待,jms,ibm-mq,Jms,Ibm Mq,我正在尝试创建一个通信类,它将向MQ发送请求并从MQ获得响应 下面是我编写的代码 TextMessage inputMsg = session.createTextMessage(message); inputMsg.setJMSReplyTo(responseQueue); try { connection.start(); sender.send(inputMsg); messageId

我正在尝试创建一个通信类,它将向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+"'");
上面这一行的问题是,在更多并发请求期间,我的响应消息被混淆了,这会导致会话混淆

有人能指导我如何解决这个问题吗


提前感谢。

您的代码有一个小问题。在您的
createConsumer
调用中,
JMSMessageID
被用作选择器。这个
JMSMessageID
实际上是您想要接收的消息的消息id。它不是代码中先前发送的请求消息的消息id

createConsumer
调用中,应该使用
JMSCorrelId
而不是
jmsessageid

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

然后,处理请求消息的服务器应用程序必须从请求消息中获取
JMSMessageID
,并将其放入
JMSCorrelId
字段并发送响应。通过这种方式,使用JMSCorrelId将请求和响应消息关联起来。

您的代码有一个小问题。在您的
createConsumer
调用中,
JMSMessageID
被用作选择器。这个
JMSMessageID
实际上是您想要接收的消息的消息id。它不是代码中先前发送的请求消息的消息id

createConsumer
调用中,应该使用
JMSCorrelId
而不是
jmsessageid

reciever = session.createConsumer(responseQueue,"JMSCorrelId = '"+messageId+"'");
然后,处理请求消息的服务器应用程序必须从请求消息中获取
JMSMessageID
,并将其放入
JMSCorrelId
字段并发送响应。通过使用
JMSCorrelId
将请求和响应消息关联起来