我有一个基于 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,只能使用我们的应用程序来完成。
答案 0 :(得分:0)
您可以通过调整 API 属性中的保证消息窗口大小和 Solace 上队列的 max-delivered-unacked-messages-per-flow 参数来限制一次发送到您的应用程序的消息数量事件经纪人。这将控制在收到传输确认或应用程序确认之前将多少消息传送到 API。
在 JMS 中,您可以在代理的连接工厂中设置保证消息窗口大小。