我在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吗?我错过了什么吗?
答案 0 :(得分:0)
您正在使用PooledConnectionFactory进行错误的操作。
请注意,根据JMS规范,您应该在多个线程中使用单个会话。
通常,JMS客户端框架使用类似于以下的代码:
这是做JMS的安全方法,但在设置和拆除连接方面花费了很多。 PooledConnectionFactory将保留一个连接的连接池,并在发送时将它们租给线程。
如果您尝试发送10k消息并重新连接每条消息,您会发现合并工厂的性能会有很大提升。