是否可以在@RabbitListener上设置预取计数

Rus*_*nko 8 java spring spring-amqp

我知道可以在这里创建SimpleMessageListenerContainerbean并设置预取计数和消息监听器,如下所示:

@Bean
public SimpleMessageListenerContainer messageListenerContainer(
        ConnectionFactory rabbitConnectionFactory,
        Receiver receiver) {
    SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
    container.setConnectionFactory(rabbitConnectionFactory);
    container.setQueueNames("hello");
    container.setMessageListener(new MessageListenerAdapter(receiver, "receive"));
    container.setPrefetchCount(1000);
    return container;
}
Run Code Online (Sandbox Code Playgroud)

但是如果我想使用声明式方法,如何为通道设置预取计数@RabbitListener

@Component
public class Receiver {

    private static final Logger log = LoggerFactory.getLogger(Receiver.class);

    @RabbitListener(queues = "hello") // how to set prefetch count here?
    public void receive(String message) {
        log.info(" [x] Received '{}'.", message);
    }

}
Run Code Online (Sandbox Code Playgroud)

这不可能?

Rus*_*nko 10

解决方案根据@ artem-bilan回答:

RabbitListenerContainerFactory在某些@Configuration类中使用预取计数10 声明bean :

@Bean
public RabbitListenerContainerFactory<SimpleMessageListenerContainer> prefetchTenRabbitListenerContainerFactory(ConnectionFactory rabbitConnectionFactory) {
    SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
    factory.setConnectionFactory(rabbitConnectionFactory);
    factory.setPrefetchCount(10);
    return factory;
}
Run Code Online (Sandbox Code Playgroud)

Receiver bean使用这个工厂bean:

@Component
public class Receiver {

    private static final Logger log = LoggerFactory.getLogger(Receiver.class);

    @RabbitListener(queues = "hello", containerFactory = "prefetchTenRabbitListenerContainerFactory")
    public void receive(String message) {
        log.info(" [x] Received '{}'.", message);
    }

    @RabbitListener(queues = "hello")
    public void receiveWithoutPrefetch(String message) {
        log.info(" [x] Received without prefetch '{}'.", message);
    }

}
Run Code Online (Sandbox Code Playgroud)

这里有两位听众仅用于演示目的.
通过这种配置,Spring创建了两个AMQP通道.每个一个@RabbitListener.首先使用我们的新prefetchTenRabbitListenerContainerFactorybean 进行预取计数10,然后使用默认rabbitListenerContainerFactorybean 进行预取计数1 .

  • 如果您使用的是Spring Boot创建的默认容器工厂,则可以在application.yml或application.properties中设置该属性 - 请参阅[boot properties appendix]中的`spring.rabbitmq.listener.prefetch`(http:// docs .spring.io /弹簧引导/文档/电流/参考/ htmlsingle /#常见的应用程序的属性). (4认同)

Art*_*lan 5

@RabbitListenercontainerFactory选项:

/**
 * The bean name of the {@link org.springframework.amqp.rabbit.listener.RabbitListenerContainerFactory}
 * to use to create the message listener container responsible to serve this endpoint.
 * <p>If not specified, the default container factory is used, if any.
 * @return the {@link org.springframework.amqp.rabbit.listener.RabbitListenerContainerFactory}
 * bean name.
 */
String containerFactory() default "";
Run Code Online (Sandbox Code Playgroud)

您可以在哪里配置SimpleRabbitListenerContainerFactory所需prefetchCountSimpleMessageListenerContainer注释,并且该注释的目标将为您提供该选项。

  • 如果您使用的是 Spring Boot 创建的默认容器工厂,您可以在 application.yml 或 application.properties 中设置该属性 - 请参阅[引导属性附录](http://docs)中的`spring.rabbitmq.listener.prefetch` .spring.io/spring-boot/docs/current/reference/htmlsingle/#common-application-properties)。 (3认同)