Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否可以在@RabbitListener上设置预取计数_Java_Spring_Spring Amqp - Fatal编程技术网

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

Java 是否可以在@RabbitListener上设置预取计数,java,spring,spring-amqp,Java,Spring,Spring Amqp,我知道可以制作SimpleMessageListenerContainerbean并在此处设置预取计数和消息侦听器,如下所示: @Bean public SimpleMessageListenerContainer messageListenerContainer( ConnectionFactory rabbitConnectionFactory, Receiver receiver) { SimpleMessageListenerContainer c

我知道可以制作
SimpleMessageListenerContainer
bean并在此处设置预取计数和消息侦听器,如下所示:

@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;
}
但是,如果我想使用声明式方法使用
@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);
    }

}

这是不可能的?

RabbitListener具有
containerFactory
选项:

/**
 * 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 "";
/**
*{@link org.springframework.amqp.rabbit.listener.RabbitListenerContainerFactory}的bean名称
*用于创建负责服务于此端点的消息侦听器容器。
*如果未指定,则使用默认容器工厂(如果有)。
*@返回{@link org.springframework.amqp.rabbit.listener.RabbitListenerContainerFactory}
*豆名。
*/
字符串containerFactory()默认为“”;

您可以使用所需的
预取计数配置
SimpleRableBitListenerContainerFactory
,该注释的目标
SimpleMessageListenerContainer
将为您提供该选项。

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

在某些
@配置
类中声明预取计数为10的
RabbitListenerContainerFactory
bean:

@Bean
public RabbitListenerContainerFactory<SimpleMessageListenerContainer> prefetchTenRabbitListenerContainerFactory(ConnectionFactory rabbitConnectionFactory) {
    SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
    factory.setConnectionFactory(rabbitConnectionFactory);
    factory.setPrefetchCount(10);
    return factory;
}
这里的两个侦听器仅用于演示。

通过这种配置,Spring创建了两个AMQP通道。每个
@RabbitListener
一个。首先使用新的
prefetchTenRabbitListenerContainerFactory
bean使用预取计数10,然后使用默认的
rabbitListenerContainerFactory
bean使用预取计数1。

我使用的是Spring boot 2.3.3,我在application.properties中更改了以下内容,它成功了

   @Bean
    public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(ConnectionFactory connectionFactory) {
        SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory);
        int concurrentConsumers = Integer.parseInt(PropertiesLoader.getProperty("queue.concurrent-consumers"));
        int maxConcurrentConsumers = Integer.parseInt(PropertiesLoader.getProperty("queue.max-concurrent-consumers"));
        int consecutiveActiveTrigger = Integer.parseInt(PropertiesLoader.getProperty("queue.consecutive-active-trigger"));
        int prefectCount = Integer.parseInt(PropertiesLoader.getProperty("queue.prefetch_count"));

        factory.setPrefetchCount(prefectCount);
        factory.setConcurrentConsumers(concurrentConsumers);
        factory.setMaxConcurrentConsumers(maxConcurrentConsumers);
        factory.setConsecutiveActiveTrigger(consecutiveActiveTrigger);
        return factory;
    }
spring.rabbitmq.listener.direct.prefetch=1000
spring.rabbitmq.listener.simple.prefetch=1000

我不知道direct和simple之间的区别,所以我将两者都设置了。

如果您使用的是Spring Boot创建的默认容器工厂,那么可以在application.yml或application.properties中设置属性-请参阅。@GaryRussell中的
Spring.rabbitmq.listener.prefetch
,文档中没有提到任何默认值。如果未设置,您知道预取大小吗?在最新版本中为250-请参阅。如果您使用的是Spring Boot创建的默认容器工厂,则可以在application.yml或application.properties中设置属性-请参阅中的
Spring.rabbitmq.listener.prefetch
spring.rabbitmq.listener.direct.prefetch=1000
spring.rabbitmq.listener.simple.prefetch=1000