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