假设我们需要等待队列中任何可用的新消息并立即处理它们。没有与交易交付相关的要求。
虽然JmsTemplate#receive
非常方便,但我不太清楚它在性能方面是否良好;老实说,速度似乎相当慢。
我的猜测是它很慢,因为每次调用都会执行相同的初始化内容。所以我采用了下一种方法,重用连接、目的地和消费者,这似乎要快得多:
private void startAsyncReceiver(final BlockingQueue<String> localQueue, final String remoteQueueName) {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
jmsTemplate.execute(new SessionCallback<Object>() {
@Override
public Object doInJms(Session session) throws JMSException {
try {
Destination destination = destinationResolver.resolveDestinationName(session, remoteQueueName, false);
MessageConsumer consumer = session.createConsumer(destination);
sessionsStartedLatch.countDown();
while (true) {
Message message = consumer.receive(MAX_VALUE);
String body = (String) jmsTemplate.getMessageConverter().fromMessage(message);
localQueue.put(body);
}
} catch (InterruptedException e) {
return null;
}
}
}, true);
}
}, remoteQueueName + "-Receiver");
t.setDaemon(true);
t.start();
}
Q1:知道为什么相同算法的 JmsTemplate#receive
显示出更差的性能结果吗?我错过了什么吗?
问题2:您能发现当前实现中存在的任何潜在问题吗?
最佳答案
模板必须为每次接收创建一个使用者。
如果您使用缓存连接工厂并将缓存消费者设置为 true,它应该会显着提高 JmsTemplate 性能,甚至接近您的代码。
但是你的实现很好。
关于java - 使用 Spring JmsTemplate 快速使用 JMS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37541182/