使用 spring jmsTemplate 发送大量消息
Sending large number of messages using spring jmsTemplate
是否有关于发送 asyncSend
设置为 true 的持久消息的最佳实践或指南。
我们没有配置事务管理器
我们有约 40k-50k 条消息,这些消息是使用配置有
的 jmsTemplate 发送的
org.apache.activemq.pool.PooledConnectionFactory
我们有一个 for 循环,它遍历消息列表并使用
发送它们
jmsTemplate.convertAndSend(destination, msg)
我们经常看到大量消息丢失,当我们关闭时 asyncSend
我们获得了可靠性,但生产者性能下降了 95%
有点猜测,因为问题不是很详细,但无论如何。
根据配置,ActiveMQ 可能对队列有内存限制(持久消息和非持久消息之间也可能不同)。因此,当内存用完时,您的 asyncSend
调用将忽略警告并继续向 "black hole" 传递消息,直到内存被消费者释放。
没有灵丹妙药可以实现最高性能和最高可靠性。很遗憾。
但是,我会尝试在连接工厂上设置 producerWindowSize
以在收到代理确认之前允许一些指定数量的数据。确切的价值是你需要尝试的东西,取决于场景和经纪人 config/resources.
解决了这个问题
List<String> messageTexts = prepareListOfMessaeTexts();
ProducerCallback producerCallback = (session, producer) -> {
Topic destination = session.createTopic(myTopicName);
for (String messageText : myMessagmessageTextseBodies) {
producer.send(destination, session.createTextMessage(messageText));
}
return null;
};
jmsTemplate.execute(producerCallback);
是否有关于发送 asyncSend
设置为 true 的持久消息的最佳实践或指南。
我们没有配置事务管理器
我们有约 40k-50k 条消息,这些消息是使用配置有
的 jmsTemplate 发送的org.apache.activemq.pool.PooledConnectionFactory
我们有一个 for 循环,它遍历消息列表并使用
发送它们jmsTemplate.convertAndSend(destination, msg)
我们经常看到大量消息丢失,当我们关闭时 asyncSend
我们获得了可靠性,但生产者性能下降了 95%
有点猜测,因为问题不是很详细,但无论如何。
根据配置,ActiveMQ 可能对队列有内存限制(持久消息和非持久消息之间也可能不同)。因此,当内存用完时,您的 asyncSend
调用将忽略警告并继续向 "black hole" 传递消息,直到内存被消费者释放。
没有灵丹妙药可以实现最高性能和最高可靠性。很遗憾。
但是,我会尝试在连接工厂上设置 producerWindowSize
以在收到代理确认之前允许一些指定数量的数据。确切的价值是你需要尝试的东西,取决于场景和经纪人 config/resources.
List<String> messageTexts = prepareListOfMessaeTexts();
ProducerCallback producerCallback = (session, producer) -> {
Topic destination = session.createTopic(myTopicName);
for (String messageText : myMessagmessageTextseBodies) {
producer.send(destination, session.createTextMessage(messageText));
}
return null;
};
jmsTemplate.execute(producerCallback);