java - 使用 Spring JmsTemplate 快速使用 JMS

标签 java spring-jms

假设我们需要等待队列中任何可用的新消息并立即处理它们。没有与交易交付相关的要求。

虽然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/

相关文章:

java - PKCS12 到 JKS 转换失败

JAVA IF else 变量

java - 如何在 Spring Boot 中设置 ActiveMQ 端口?

java - JMS CachingConnectionFactory onException 方法永远不会在 JMSException 上调用

java - 在java中为两个不同的类创建对象会引发StackOverflow

java - 将文件名与整数进行比较

Java 方法命名约定 toType 和 asType 的区别?

tomcat - 部署在同一 tomcat 中的跨应用程序之间的 JMS 消息传递

java - 来自 Java SE 的 JMS 连接

java - 带有基于内容的过滤器的 JMS