使用 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.

我用 ProducerCallback

解决了这个问题
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);