2012-08-13 94 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