Java 使用springjmstemplate快速消费JMS
假设我们需要等待队列中的任何新消息,并立即处理它们。没有与事务性交付相关的要求 虽然Java 使用springjmstemplate快速消费JMS,java,spring-jms,Java,Spring Jms,假设我们需要等待队列中的任何新消息,并立即处理它们。没有与事务性交付相关的要求 虽然JmsTemplate#receive非常方便,但我不太清楚它从性能角度看是否好;老实说,这似乎相当缓慢 我猜这很慢,因为每次调用都执行相同的初始化。所以我做了下一步,重用了连接、目的地和消费者,这似乎要快得多: private void startAsyncReceiver(final BlockingQueue<String> localQueue, final String remoteQueu
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();
}
private void startAsyncReceiver(最终阻塞队列localQueue,最终字符串remoteQueueName){
线程t=新线程(新的可运行线程(){
@凌驾
公开募捐{
execute(新SessionCallback(){
@凌驾
公共对象doInJms(会话)引发JMSException{
试一试{
Destination Destination=destinationResolver.resolveDestinationName(会话,remoteQueueName,false);
MessageConsumer=session.createConsumer(目的地);
SessionStartedLatch.countDown();
while(true){
消息消息=消费者接收(最大值);
字符串体=(字符串)jmsTemplate.getMessageConverter().fromMessage(消息);
localQueue.put(body);
}
}捕捉(中断异常e){
返回null;
}
}
},对);
}
},remoteQueueName+“-Receiver”);
t、 setDaemon(true);
t、 start();
}
Q1:知道为什么JmsTemplate#receive
对同一算法的性能结果较差吗?我错过什么了吗?Q2:您能看到当前实施中存在的任何潜在问题吗?模板必须为每个接收创建一个使用者 如果使用缓存消费者设置为true的缓存连接工厂,它将显著提高JmsTemplate性能,甚至可以接近您的代码
但是您的实现很好。模板必须为每个接收创建一个使用者 如果使用缓存消费者设置为true的缓存连接工厂,它将显著提高JmsTemplate性能,甚至可以接近您的代码
但是您的实现很好。谢谢您的回复。我应该考虑使用< <代码> session >委托()/>代码>每个代码>消费。只有在使用事务时,我才能考虑使用<代码> Session .Actudio()/代码>在每个代码>消费。