0

我有一个基于 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),但它没有帮助。

请帮忙。谢谢!

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

4

1 回答 1

0

您可以通过调整 API 属性中的 Guaranteed Message Window Size 和 Solace 事件代理上队列的 max-delivered-unacked-messages-per-flow 参数来限制一次发送到应用程序的消息数量。这将控制在接收传输确认或应用程序确认之前将多少消息传递到 API。

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

于 2021-08-02T18:23:11.223 回答