代码之家  ›  专栏  ›  技术社区  ›  Prabhu R

将多个@rabbitlistener bean添加到容器工厂的优雅方法

  •  0
  • Prabhu R  · 技术社区  · 7 年前

    这是我的 @Configuration

       @Bean
        public AmqpAdmin amqpAdmin()
        {
            RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory());
    
            DirectExchange dirExchange = new DirectExchange("evtExchange", true,
                    false);
    
            rabbitAdmin.declareExchange(dirExchange);
            rabbitAdmin.declareQueue(processQueue);
            Binding processBinding = BindingBuilder.bind(processQueue)
                    .to(dirExchange).with("rkey.process");
            rabbitAdmin.declareBinding(processBinding);
    
            return rabbitAdmin;
        }
    
        @Bean
        public RabbitTemplate rabbitTemplate()
        {
            RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory());
            return rabbitTemplate;
        }
    
        @Bean
        public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory()
        {
            SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
            factory.setConnectionFactory(connectionFactory());
            SimpleMessageListenerContainer container = factory
                    .createListenerContainer();
            factory.setConcurrentConsumers(50);
            factory.setMaxConcurrentConsumers(100);
            container.setStartConsumerMinInterval(3000);
            container.setQueues(processQueue);
            factory.setAdviceChain(retryInterceptor());
            return factory;
        }
    
        @Bean
        public RetryOperationsInterceptor retryInterceptor()
        {
            return RetryInterceptorBuilder.stateless().maxAttempts(5)
                    .backOffOptions(1000, 2.0, 10000).recoverer(new RejectAndDontRequeueRecoverer()).build();
        }
    
        @Bean
        public ProcessQueueListener processListener()
        {
            return new ProcessQueueListener();
        }
    
        @Bean
        public ProcessQueueListener processListener2()
        {
            return new ProcessQueueListener();
        }
    
        @Bean
        public ProcessQueueListener processListener3()
        {
            return new ProcessQueueListener();
        }
    

    这里是 @RabbitListener

    @RabbitListener(containerFactory = "rabbitListenerContainerFactory", queues = "process")
    public class ProcessQueueListener
    {
    
        public ProcessQueueListener()
        {
        }
    
        @RabbitHandler
        void receiveMessage(String message)
        {
            // doSomething
        }
    
    } 
    

    只有当我实例化 processListener() , processListener2() processListener3() 另外,我开始在进程队列的rabbitmq管理中看到多个使用者,并且每个侦听器处理消息,否则,尽管指定了 setConcurrentConsumers()

    有没有一种优雅的方法可以根据需要声明多个监听器,根据需要增加和减少。或声明多个 @Bean 是唯一的选择吗?还是我做错了什么?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Gary Russell    7 年前

    您使用的是什么版本?

    我刚复制了你们的集装箱工厂,它对我来说很好(2.1.3)。

    enter image description here

    btw,从2.0版开始,您可以添加 concurrency @RabbitListener 它将覆盖容器工厂中的任何值。

    /**
     * Set the concurrency of the listener container for this listener. Overrides the
     * default set by the listener container factory. Maps to the concurrency setting of
     * the container type.
     * <p>For a
     * {@link org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer
     * SimpleMessageListenerContainer} if this value is a simple integer, it sets a fixed
     * number of consumers in the {@code concurrentConsumers} property. If it is a string
     * with the form {@code "m-n"}, the {@code concurrentConsumers} is set to {@code m}
     * and the {@code maxConcurrentConsumers} is set to {@code n}.
     * <p>For a
     * {@link org.springframework.amqp.rabbit.listener.DirectMessageListenerContainer
     * DirectMessageListenerContainer} it sets the {@code consumersPerQueue} property.
     * @return the concurrency.
     * @since 2.0
     */
    String concurrency() default "";
    

    也不相关,但你不应该这样做 rabbitAdmin.declareExchange(dirExchange) 在bean声明中—在应用程序上下文生命周期中连接到rabbitmq太早了。将交换、队列和绑定添加为 @Bean S和管理员将自动查找并声明它们。