【发布时间】:2016-05-31 08:58:09
【问题描述】:
假设我们需要等待队列中可用的任何新消息并立即处理它们。没有与交易交付相关的要求。
虽然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 在相同算法下表现出更差的性能吗?我是否遗漏了什么?
Q2:您是否发现当前实施存在任何潜在问题?
【问题讨论】:
标签: java spring-jms