【问题标题】:How do I make sure Spring JMS concurrently consuming messages?如何确保 Spring JMS 并发消费消息?
【发布时间】:2020-06-19 10:52:35
【问题描述】:

我正在使用 Spring-JMS 来使用队列中的消息。我已将并发消费者配置为 5,将最大并发消费者配置为 10,然后在队列中推送超过 1k 条消息。我可以看到有 5 个 DMLC 消费者正在运行,但一次我只能看到 1 个正在消费消息,而其他所有消费者都处于等待状态。我是否缺少任何配置,以便所有 5 个 DMLC 都应该开始使用这些消息。 我正在遵循下面链接中给出的方法,因为我有多个要注册的队列。 https://docs.spring.io/spring/docs/current/spring-framework-reference/integration.html#jms-annotated-programmatic-registration.

使用下面的代码注册多个队列

 queues.foreach( queue -> {
     SimpleJmsListenerEndpoint endpoint = new SimpleJmsListenerEndpoint();
            endpoint.setId("myJmsEndpoint"+counter++);
            endpoint.setDestination(queue);
            registrar.registerEndpoint(endpoint,defaultJMSListenerCOnnectionFactory);
    });

【问题讨论】:

    标签: spring-jms


    【解决方案1】:

    如果您使用 ActiveMQ,则有一个默认为 1k 的预取设置。这意味着消息将一次推送给消费者 1k。您可以添加:

    ?jms.prefetchPolicy.all=1
    

    到您的客户代理 URL。这将禁用预取。

    【讨论】:

    • 是的,我正在使用 ActiveMQ。我已将并发消费者设置为 5,最大并发消费者为 10。在设置上述 prefetchPolicy 后,我仍然看到 10 个 DMLC 消费者,但一次只有一个消费者在消费消息,其他消费者仅处于等待状态。所以看起来 PrefetchPolicy 不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    • 2015-09-19
    • 2014-09-06
    • 2011-12-22
    • 2020-03-18
    • 2016-06-14
    • 2020-12-09
    相关资源
    最近更新 更多