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