2013-01-25 63 views
1

我試圖創建一個通信類,它將向MQ發送請求並從中獲取響應。基於JMS消息選擇器的MessageConsumer.recieve正在等待對象

以下是我寫的代碼。

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+"'"); 

問題與上面的線是我的響應消息中的併發請求而導致會話混淆越來越混淆。

有人請指導我如何解決這個問題?

在此先感謝。

回答

1

您的代碼存在一個小問題。在您的createConsumer呼叫JMSMessageID被用作選擇器。這JMSMessageID實際上是您想要接收的消息ID。這不是在代碼中發送的請求消息的消息ID。

您應該在您的createConsumer調用中使用JMSCorrelId而不是JMSMessageID

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

然後就是處理請求消息,您的服務器應用程序必須採取從請求消息JMSMessageID並投入JMSCorrelId場和發送響應。這種方式使用JMSCorrelId請求和響應消息是相關的。