2016-06-01 143 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

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

可以在其中配置SimpleRabbitListenerContainerFactory與所需prefetchCount和目標SimpleMessageListenerContainer爲註釋將有你這樣的選擇。

+0

如果你正在使用由Spring啓動創建的默認容器廠,你可以設置application.yml或application.properties財產 - 看'[引導性附錄](HTTP spring.rabbitmq.listener.prefetch': //docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#common-application-properties)。 –

5

根據@阿爾喬姆 - 比蘭回答解決方案:

在一些@Configuration類中聲明RabbitListenerContainerFactory豆與預取數10:

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

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

} 
這裏

兩個聽衆是僅用於演示目的。
利用這種配置春將創建兩個AMQP通道。每個@RabbitListener一個。先用預取使用我們的新prefetchTenRabbitListenerContainerFactory豆和第二位預取數1使用默認rabbitListenerContainerFactory豆數10。

+2

如果你正在使用由Spring啓動創建的默認容器廠,你可以設置application.yml或application.properties財產 - 看'[引導性附錄](HTTP spring.rabbitmq.listener.prefetch':// docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#common-application-properties)。 –

相關問題