java - 使用 MessageListener 接口(interface)获取 JMS 请求的响应时间

标签 java jms response

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

    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 中的时间。

还有其他方法吗?

最佳答案

你可以有一个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. */
         }
    }

}

关于java - 使用 MessageListener 接口(interface)获取 JMS 请求的响应时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11942682/

相关文章:

java - 这个打印可以在 Flash/Java 中完成吗?

java - 为什么在java中有两种使用线程的方式?

java - Spring 3.1 HandlerInterceptor 未被调用

java - 为什么 JMSProducer 接口(interface)不扩展 java.lang.Autocloseable?

java - 如何将http响应放入Set中

java - 带有 CXF : How to use the ResponseWrapper? 的 Web 服务

java - 如何在不初始化的情况下访问公共(public)方法

java - 单线程与多线程 JMS 生产者

java - 无法启动Camel 1.5.0

java - 如何在 Java 中将类显示为 JSON 响应?