【问题标题】:Fast JMS consuming with Spring JmsTemplate使用 Spring JmsTemplate 快速使用 JMS
【发布时间】: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


    【解决方案1】:

    模板必须为每个接收创建一个消费者。

    如果您使用缓存连接工厂并将缓存使用者设置为 true,它应该会显着提高 JmsTemplate 性能,甚至接近您的代码。

    但是你的实现很好。

    【讨论】:

    • 感谢您的回复。我是否应该考虑在每个 consumer.receive() 之后使用 session.commit() 来释放 JMS 端的任何资源?
    • 仅当您使用事务时。
    猜你喜欢
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 2019-08-05
    • 2015-02-19
    • 2015-06-10
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多