2016-06-01 3 views
2

Я знаю, что это можно сделать SimpleMessageListenerContainer боб и установить предвыборки количества и слушатель сообщений здесь, как это:Можно ли установить счетчик на предвыборках @RabbitListener

@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); 
    } 

} 

Невозможно?

ответ

2

@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 ""; 

Где можно настроить SimpleRabbitListenerContainerFactory с желаемым prefetchCount и мишенью SimpleMessageListenerContainer для этой аннотации будет иметь этот вариант для вас.

+0

Если вы используете фабрику контейнеров по умолчанию, созданную Spring Boot, вы можете установить ее свойство в application.yml или application.properties - см. 'Spring.rabbitmq.listener.prefetch' в [приложении свойств загрузки] (http: //docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#common-application-properties). –

5

Решение в соответствии с @ Artem-билан ответ:

Объявить RabbitListenerContainerFactory боб с графом упреждающей 10 в некоторых @Configuration класса:

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

Receiver боб использует эту фабрику боб:

@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); 
    } 

} 

Два слушателя здесь просто для демонстрационной цели.
С помощью этой конфигурации Spring создает два канала AMQP. Один для каждого @RabbitListener. Сначала с подсчетом предварительной выборки 10 с использованием нашего нового компонента prefetchTenRabbitListenerContainerFactory и второго с подсчетом предварительной выборки 1 с использованием компонента по умолчанию rabbitListenerContainerFactory.

+2

Если вы используете фабрику контейнеров по умолчанию, созданную Spring Boot, вы можете установить свойство в application.yml или application.properties - см. 'Spring.rabbitmq.listener.prefetch' в [приложении свойств загрузки] (http: // docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#common-application-properties). –

Смежные вопросы