【问题标题】:Getting the response time for JMS requests using MessageListener interface使用 MessageListener 接口获取 JMS 请求的响应时间
【发布时间】:2012-08-10 04:14:46
【问题描述】:

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

    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

    }
}

要求是获取每条消息的响应时间并将其存储。我该怎么做?考虑在消息的属性中设置时间/日期,然后在 Listener 中使用 Correlation id 计算时间。

还有其他方法吗?

【问题讨论】:

    标签: java jms response


    【解决方案1】:

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

    对于此示例,假设 timemap 是 Map&lt;String, Long&gt;,并且它在发送者和响应侦听器的范围内(您希望如何完成这取决于您)。

    上面的循环体,已修改:

                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)。
    • 这里我只是设置响应消息的监听器,我所做的只是将消息发送到队列。但是接收者应该从队列中接收到这条消息,对吧?什么时候发生。对不起,我的无知。只是对整个流程有点困惑。
    猜你喜欢
    • 2013-08-09
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多