【问题标题】:Is there a way to set prefetchSize for a queue dynamically with Spring Boot?有没有办法使用 Spring Boot 为队列动态设置 prefetchSize?
【发布时间】:2021-08-16 22:01:25
【问题描述】:

我的app.properties 中有一个队列列表,如下所示:

queue.listener.names=queue0, queue1, queue2, queue3, queue4
queue.concurrency=1, 2, 3, 4, 5
queue.prefetchSize=1, 2, 3, 4, 5

我的任务是在 ActiveMQ 中使用app.properties 的详细信息注册所有端点。

现在,我的代码是这样的:

@Configuration
@EnableJms
public class MyClass implements JmsListenerConfigurer {

    @Value("${queue.listener.names}")
    private List<String> listeners;

    @Value("${queue.concurrency}")
    private String[] concurr;
    
    @Value("${queue.prefetchSize}")
    private String[] prefetchSize;

    @Override
    public void configureJmsListeners(JmsListenerEndpointRegistrar registrar) {

        listeners.forEach(listener -> {
            SimpleJmsListenerEndpoint endpoint = new SimpleJmsListenerEndpoint();
            int index = listeners.indexOf(listener);
            endpoint.setId(listener);
            endpoint.setDestination(listener);
            endpoint.setConcurrency(concurr[index]);
            endpoint.setMessageListener(message -> {
                // do something
            });
            registrar.registerEndpoint(endpoint);
            
        });
    }
}

问题是我找不到为每个队列设置预取大小的方法。当我通过代理 url 时,我只是通过设置 prefetchSize 来为所有队列获取它。

【问题讨论】:

    标签: spring-boot activemq


    【解决方案1】:

    the documentation 中所述,预取大小可以通过在目标上使用特殊语法基于每个消费者进行配置,例如:

    TEST.QUEUE?consumer.prefetchSize=10
    

    所以在你的app.properties 中你可以使用这样的东西:

    queue.listener.names=queue0?consumer.prefetchSize=200, queue1?consumer.prefetchSize=100, queue2?consumer.prefetchSize=20, queue3?consumer.prefetchSize=10, queue4?consumer.prefetchSize=50
    

    【讨论】:

      猜你喜欢
      • 2021-06-09
      • 1970-01-01
      • 2022-10-24
      • 2021-11-13
      • 1970-01-01
      • 2017-06-27
      • 2013-10-19
      • 2023-03-27
      • 2021-05-16
      相关资源
      最近更新 更多