使用JmsTemplate异步发送消息观察到的延迟

时间:2019-05-08 03:01:48

标签: spring-jms jmstemplate

JmsTemplate没有内置的API支持JMS 2.0异步发送。我使用ProducerCallback对象,并直接在JMS MessageProducer上调用JMS 2.0异步发送API。

消息已成功发送。但是,如果我发送2条大消息(2M消息),则第二次发送将比发送第一条消息花费更多的时间。

根据我的测试,第一次发送需要133ms,第二次发送需要10417ms。看起来它发送第二条消息,直到完成发送第一条消息为止。

但是,如果我直接使用原始JMS 2.0异步发送API(不使用JmsTemplate),则在第二次发送时不会阻塞。根据我的测试,第一次发送需要50毫秒,第二次发送需要63毫秒。

以下代码是我使用的JmsTemplate,Spring JMS中是否有任何特殊的处理措施阻止了第二条消息的发送?

public void sendQueueMsgAsync(String msg, CompletionListener completionListener) {
  jmsQueueTemplate.execute(new ProducerCallback() {

   @Override
   public Object doInJms(Session session, MessageProducer producer) throws JMSException {
    TextMessage txtMsg = session.createTextMessage();
    txtMsg.setText(msg);
    producer.send(txtMsg, completionListener);
    return null;
   }
  });
 }

我打电话两次发送2条消息。

start = System.currentTimeMillis();
springJmsService.sendQueueMsgAsync(msgToSend, listener1);
end = System.currentTimeMillis();
timeTaken = end - start;
logger.info("send async queue msg taken1=" + timeTaken);

start = System.currentTimeMillis();
springJmsService.sendQueueMsgAsync(msgToSend, listener2);
end = System.currentTimeMillis();
timeTaken = end - start;
logger.info("send async queue msg taken2=" + timeTaken);

0 个答案:

没有答案