我使用以下代码块将 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 放在响应消息中才能正常工作。
对于此示例,假设 timemap
是 Map<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/