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);