Задержка при использовании асинхронной отправки сообщений JmsTemplate - PullRequest
0 голосов
/ 08 мая 2019

JmsTemplate не имеет встроенного API для поддержки асинхронной отправки JMS 2.0. Я использую объект ProducerCallback и вызываю API асинхронной отправки JMS 2.0 непосредственно в JMS MessageProducer.

Сообщение успешно отправлено. Но если я отправлю 2 больших сообщения (сообщение 2M), вторая отправка займет больше времени, чем отправка первого сообщения.

Из моего тестирования первая отправка занимает 133 мс, вторая отправка занимает 10417 мс. Похоже, он отправляет второе сообщение до завершения отправки первого сообщения.

Но если я использую сырой API JMS 2.0 для асинхронной отправки напрямую (не использует 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);
...