如何在我的 Solace 消费者应用程序中减慢消费速度

时间:2021-07-19 09:56:37

标签: java jmx solace solace-mq

我有一个基于 Spring Boot 的 Java 应用程序,它使用 javax.jms 从 Solace 队列(假设为 A)读取消息。然后我的应用程序分别对每条消息应用 10 秒延迟(使用 DelayedQueue)。过了 10 秒后,我将消息推送到另一个 Solace 队列(假设为 B)。一切正常,如果队列 A 中的初始消息较少,即使我可以为每条消息设置适当的 10 秒延迟。

但对我来说面临的挑战是,如果队列 A 中有大量消息(通常发生在我的用例中),并且当我启动应用程序时,它会非常快地提取消息(每秒 10-15K 条消息)。这使我的应用程序内存不足(超出 GC 开销限制)。

问题:我的问题是如何减慢我的应用程序中的消耗速度。我们有办法每秒处理大约 2-3K 条消息吗?我是否需要在我的代码中进行一些配置更改。请指教。

以下是我尝试过的设置,它没有帮助。即使在此之后,我的应用程序每秒也会提取 12-15K 条消息:

environment.put(SupportedProperty.SOLACE_JMS_CONSUMER_DEFAULT_FLOW_CONGESTION_LIMIT, 2000);
environment.put(SupportedProperty.SOLACE_JMS_CONSUMER_DISPATCHER_QUEUE_SIZE, 2000);

即使我尝试增加堆内存(初始:2GB 和最大:4GB),但无济于事。

请帮忙。谢谢!

P.S.我不能在这里使用 TTL,只能使用我们的应用程序来完成。

1 个答案:

答案 0 :(得分:0)

您可以通过调整 API 属性中的保证消息窗口大小和 Solace 上队列的 max-delivered-unacked-messages-per-flow 参数来限制一次发送到您的应用程序的消息数量事件经纪人。这将控制在收到传输确认或应用程序确认之前将多少消息传送到 API。

在 JMS 中,您可以在代理的连接工厂中设置保证消息窗口大小。