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 .
在@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 "";
Run Code Online (Sandbox Code Playgroud)
您可以在哪里配置SimpleRabbitListenerContainerFactory所需prefetchCount的SimpleMessageListenerContainer注释,并且该注释的目标将为您提供该选项。