2012-08-13 73 views
1

我正在使用以下代碼塊將JMS消息發送到隊列,並在響應隊列中獲取響應消息。 (下面的代碼運行在批次20每個線程的100條消息,五個線程同時運行)使用MessageListener接口獲取JMS請求的響應時間

for(int i=0;i<=20;i++) 
      { 
       msg=myMessages.get(i); // myMessages is an array of TextMessages 
       qsender = qsession.createSender((Queue)msg.getJMSDestination()); 
       qreceiver=qsession.createReceiver((Queue)msg.getJMSDestination()); 

       tempq = qsession.createTemporaryQueue(); 
       responseConsumer = qsession.createConsumer(tempq); 
       msg.setJMSReplyTo(tempq); 
       responseConsumer.setMessageListener(new Listener()); 

       msg.setJMSCorrelationID(msg.getJMSCorrelationID()+i); 
       qsender.send(msg); 
      } 

監聽器執行:

public class Listener 
implements MessageListener 
{ 
    public void onMessage(Message msg) 
    { 
     TextMessage tm = (TextMessage) msg; 
     // to calculate the response time 

    } 
} 

的要求是獲得響應時間的每個消息花費和存儲它。我該如何解決它?考慮在消息的屬性中設置時間/日期,然後使用Correlation id來計算Listener中的時間。

還有另外一種方法可以解決嗎?

回答

1

您可以有一個Map<String, Long>將您的CorrelationID映射到發送的時間,然後從偵聽器中查找它們。發送響應的過程必須在響應消息上放置正確的CorrelationID才能使其正常工作。

對於此示例,假設timemapMap<String, Long>,並且它在發送方和響應監聽器的範圍內(您希望如何完成是由您決定的)。從上面

你的循環體,改性:

  msg=myMessages.get(i); // myMessages is an array of TextMessages 
      qsender = qsession.createSender((Queue)msg.getJMSDestination()); 
      qreceiver=qsession.createReceiver((Queue)msg.getJMSDestination()); 

      tempq = qsession.createTemporaryQueue(); 
      responseConsumer = qsession.createConsumer(tempq); 
      msg.setJMSReplyTo(tempq); 
      responseConsumer.setMessageListener(new Listener()); 

      msg.setJMSCorrelationID(msg.getJMSCorrelationID()+i); 
      /* MODIFICATIONS */ 
      synchronzied(timemap){ 
       timemap.put(msg.getJMSCorrelationID(), System.currentTimeMillis()); 
      } /* END MODIFICATIONS */ 
      qsender.send(msg); 

你的監聽器,改性:

public void onMessage(Message msg) 
{ 
    TextMessage tm = (TextMessage) msg; 
    long now = System.currentTimeMillis(); 
    long responseTime = 0; 
    synchronized(timemap){ 
     Long sent = timemap.get(msg.getJMSCorrelationID()); 
     if(sent != null){ 
      /* Store this value, this is the response time in milliseconds */ 
      responseTime = now - sent; 
     }else{ 
      /* Error condition. */ 
     } 
    } 

} 
+0

在onMessage將在當消息到達接收器這種情況下被稱爲?或者當響應回到臨時隊列時? – Chillax 2012-08-16 06:58:27

+0

它的連接方式與您的問題相同。當響應返回到臨時隊列中時,將調用'onMessage(Message)'。 – Dev 2012-08-16 15:44:49

+0

這裏我只是設置響應消息的偵聽器,我所做的就是將消息發送到隊列。但Receiver應該從Queue接收此消息嗎?什麼時候發生。對不起,我的無知。在整個流程中有點混亂。 – Chillax 2012-08-22 13:08:33