SJMS2与JMS组件之间的ActiveMQ Artemis之间的消息传递

时间:2020-02-26 12:44:23

标签: apache-camel jms activemq-artemis

我试图找到使用骆驼将消息从一个ActiveMQ Artemis队列传输到另一个队列的最快方法。我以为Camel的SJMS2组件会比Camel的传统JMS组件快,但是使用JMS组件的路由快了2.5倍(20,000 vs 8,000 msg / s)。我使用Camel版本2.20.2和Artemis版本2.11.0。

使用JMS路由

import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.impl.JndiRegistry;
import org.apache.camel.test.junit4.CamelTestSupport;
import org.junit.Test;
import org.messaginghub.pooled.jms.JmsPoolConnectionFactory;

import javax.jms.ConnectionFactory;
import java.util.concurrent.TimeUnit;

public class JMSTransferTest extends CamelTestSupport {
    @Test
    public void testArtemis() throws Exception {
        TimeUnit.SECONDS.sleep(100);
    }

    @Override
    protected RouteBuilder createRouteBuilder() throws Exception {
        return new RouteBuilder() {
            public void configure() {
                from("jms://TEST.IN?connectionFactory=#artemisCF&concurrentConsumers=200")
                        .to("jms://TEST.OUT?connectionFactory=#artemisCF");
            }
        };
    }

    @Override
    protected JndiRegistry createRegistry() throws Exception {
        JndiRegistry registry = super.createRegistry();

        final ConnectionFactory connFactory = new ActiveMQConnectionFactory("tcp://localhost:61622");
        final ConnectionFactory connFactoryDeadLeatter = new ActiveMQConnectionFactory("tcp://localhost:61622");
        JmsPoolConnectionFactory pooledConnectionFactory = new JmsPoolConnectionFactory();

        pooledConnectionFactory.setConnectionFactory(connFactory);
        pooledConnectionFactory.setMaxConnections(20);
        pooledConnectionFactory.setMaxSessionsPerConnection(100);
        registry.bind("artemisCF", pooledConnectionFactory);
        registry.bind("deadLetterCF", connFactoryDeadLeatter);
        return registry;
    }
}

使用SJMS2进行路由,其他设置如上面的代码

@Override
protected RouteBuilder createRouteBuilder() throws Exception {
    return new RouteBuilder() {
        public void configure() {
            from("sjms2://TEST.IN?connectionFactory=#artemisCF&consumerCount=200&asyncStartListener=true")
                    .to("sjms2://TEST.OUT?connectionFactory=#artemisCF");
        }
    };
}

如何使用SJMS2组件获得与JMS组件相同的速度?

1 个答案:

答案 0 :(得分:1)

克劳斯·易卜生在邮件列表中回复如下

200个消费者太多了。相反,这会使速度变慢 200个消费者竞相发送消息。而是尝试找到较低的余额 更接近CPU核心等。

通常,JMS客户端具有预取缓冲区(或诸如 这),这意味着消费者可以预先下载1000条消息,然后 其他199个使用者无法处理这些消息。所以你需要 也调整此选项。

如果使用者和远程网络连接过多, 那么您对IO等会变得太健谈了。 在用例上。

spring-jms内置有一个线程池,可以自动增长/收缩 取决于负载,这可以解释为什么不使用开箱即用 调整似乎更快。

编写这样的逻辑要复杂一些,这还没有添加到 sjms。我为此创建了一张票 https://issues.apache.org/jira/browse/CAMEL-14637

您可以与商业Camel支架取得联系,因为 在JMS经纪人方面具有丰富经验的公司和顾问 和骆驼,并使它们调校到非常高的性能设定 JVM和OS以及硬件都可以发挥很大的作用。

我还找到了关于该主题https://dzone.com/articles/performance-tuning-ideas-for-apache-camel

的精彩文章