gpt4 book ai didi

java - ActiveMQ:使用PooledConnectionFactory不会提高性能

转载 作者:行者123 更新时间:2023-12-03 13:10:21 48 4
gpt4 key购买 nike

我正在ActiveMQ(5.12.1)中试验PooledConnectionFactory-但看不到任何性能提升(甚至更糟:使用PooledConnectionFactory比ActiveMQConnectionFactory慢)。

我的工作:在多个线程中发送一些100.000消息(使用CompletableFuture)。一个与ActiveMQConnectionFactory一起运行,另一个与PooledConnectionFactory一起运行:

第一次运行:

ConnectionFactory cf = new ActiveMQConnectionFactory("tcp://localhost:61616");
Connection connection = cf.createConnection();
connection.start();a
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
producer = session.createProducer(null);
final Topic topic = session.createTopic(topicName);
final ObjectMessage message = session.createObjectMessage(myObject);
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
producer.send(topic, message);

第二次运行:
PooledConnectionFactory pcf = new PooledConnectionFactory("tcp://localhost:61616");
pcf.setMaxConnections(8);
Connection connection = pcf.createConnection();
connection.start();
...

更多细节:
  • 我的测试应用程序创建了250个MessageProducers,每个均在其自己的线程中运行。
  • Connection/Session/MessageProducer仅创建一次-永远不会关闭。
  • 每个线程以循环的方式尽快发送消息。

  • 我不明白为什么PooledConnectionFactory(connections> 1)不会导致消息数量/秒增加-与非PooledConnectionFactory(connections == 1)相比。

    我是否以错误的方式设置PooledConnectionFactory?我想念什么吗?

    最佳答案

    您在错误的情况下使用PooledConnectionFactory。

    请注意,根据JMS规范,您应该在多个线程中使用一个Session。

    通常,JMS客户端框架使用类似于以下内容的代码:

  • 创建连接
  • 创建 session
  • 创建生产者
  • 发送消息
  • 关闭生产者
  • 关闭 session
  • 关闭连接

  • 这是执行JMS的安全方法,但是在建立和断开连接方面花费很多。 PooledConnectionFactory会保留一个已连接的连接池,并在发送时将其租借给线程。

    如果您尝试发送10k消息并为每条消息重新连接,则合并工厂的性能会大大提高。

    一些背景: http://activemq.apache.org/jmstemplate-gotchas.html

    关于java - ActiveMQ:使用PooledConnectionFactory不会提高性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35558407/

    48 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com