ActiveMQ:使用PooledConnectionFactory

时间:2016-02-22 16:10:06

标签: java multithreading jms activemq

我在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,每个MessageProducers都在自己的线程中运行。

  • Connection / Session / MessageProducer只创建一次 - 从不关闭。

  • 消息以每个线程循环的形式发送,尽可能快。

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

我是以错误的方式设置PooledConnectionFactory吗?我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

您正在使用PooledConnectionFactory进行错误的操作。

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

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

  1. 创建连接
  2. 创建会话
  3. 创建制作人
  4. 发送消息
  5. 关闭生产者
  6. close session
  7. 关闭连接
  8. 这是做JMS的安全方法,但在设置和拆除连接方面花费了很多。 PooledConnectionFactory将保留一个连接的连接池,并在发送时将它们租给线程。

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

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