Java 使用MessageListener接口获取JMS请求的响应时间

Java 使用MessageListener接口获取JMS请求的响应时间,java,jms,response,Java,Jms,Response,我使用下面的代码块将JMS消息发布到队列,并在响应队列中获取响应消息。(以下代码以每线程20条为一批运行100条消息,5个线程同时运行) 要求是获得每条消息所需的响应时间并将其存储。我该怎么做呢?考虑在消息的属性中设置时间/日期,然后使用关联id计算侦听器中的时间 还有别的办法吗 您可以有一个映射,将您的CorrelationID映射到发送的时间,然后从侦听器中查找它们。发送响应的进程必须将正确的CorrelationID放在响应消息上才能工作 对于本例,假设timemap是一个Map,并且它在

我使用下面的代码块将JMS消息发布到队列,并在响应队列中获取响应消息。(以下代码以每线程20条为一批运行100条消息,5个线程同时运行)

要求是获得每条消息所需的响应时间并将其存储。我该怎么做呢?考虑在消息的属性中设置时间/日期,然后使用关联id计算侦听器中的时间


还有别的办法吗

您可以有一个
映射
,将您的CorrelationID映射到发送的时间,然后从侦听器中查找它们。发送响应的进程必须将正确的CorrelationID放在响应消息上才能工作

对于本例,假设
timemap
是一个
Map
,并且它在发送方和响应侦听器的范围内(如何实现这一点取决于您)

您的循环体从上方开始,已修改:

            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. */
         }
    }

}
您的侦听器,已修改:

            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. */
         }
    }

}

您可以有一个
映射
,将您的CorrelationID映射到发送的时间,然后从侦听器中查找它们。发送响应的进程必须将正确的CorrelationID放在响应消息上才能工作

对于本例,假设
timemap
是一个
Map
,并且它在发送方和响应侦听器的范围内(如何实现这一点取决于您)

您的循环体从上方开始,已修改:

            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. */
         }
    }

}
您的侦听器,已修改:

            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. */
         }
    }

}

在这种情况下,当消息到达接收方时,将调用onMessage?或者是当响应返回到临时队列时?它的连接方式与您的问题中的方式相同。当响应返回临时队列时,将调用
onMessage(Message)
。这里我只是为响应消息设置侦听器,我所做的就是将消息发送到队列。但是接收方应该从队列中接收此消息,对吗?什么时候会这样。对不起,我的无知。整个流程有点混乱。在这种情况下,当消息到达接收方时,会调用onMessage吗?或者是当响应返回到临时队列时?它的连接方式与您的问题中的方式相同。当响应返回临时队列时,将调用
onMessage(Message)
。这里我只是为响应消息设置侦听器,我所做的就是将消息发送到队列。但是接收方应该从队列中接收此消息,对吗?什么时候会这样。对不起,我的无知。整个流程都有点混乱。