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()/代码>在每个代码>消费。