Обновление Spring Boot 1.5.x до 2.2.x RabbitMQ не объявляет привязки со списком - PullRequest
0 голосов
/ 13 апреля 2020

Я использовал для объявления очередей, обменов и привязок в одном из моих файлов конфигурации следующим образом:

@EnableRabbit
@Configuration
public class MyRabbitConfiguration {

    @Bean
    public FanoutExchange firstExchange() {
        return new FanoutExchange("firstExchange");
    }

    @Bean
    public Queue firstQueue() {
        return new Queue("firstQueue", true, false, false);
    }

    @Bean
    public FanoutExchange secondExchange() {
        return new FanoutExchange("secondExchange");
    }

    @Bean
    public Queue secondQueue() {
        return new Queue("secondQueue", true, true, true);
    }

    @Bean
    public List<Declarable> bindings() {
        return Arrays.asList(
                BindingBuilder.bind(firstQueue()).to(firstExchange()),
                BindingBuilder.bind(secondQueue()).to(secondExchange()));
    }

    @Bean
    public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory){
        final RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
        rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter());
        return rabbitTemplate;
    }
}

И это работало довольно хорошо. После обновления с Spring Boot 1.5.x (очевидно, также для начинающих) до Spring Boot 2.2.x все работает, кроме Binding s. Когда я заменяю:

@Bean
public List<Declarable> bindings() {
    return Arrays.asList(
            BindingBuilder.bind(firstQueue()).to(firstExchange()),
            BindingBuilder.bind(secondQueue()).to(secondExchange()));
}

на:

@Bean
public Binding firstBinding() {
    return BindingBuilder.bind(firstQueue()).to(firstExchange());
}

@Bean
public Binding secondBinding() {
    return BindingBuilder.bind(secondQueue()).to(secondExchange());
}

, он начинает работать, как я ожидаю, и у меня все еще есть Binding s. Я подозреваю, что это как-то связано с этим , но не смог понять. Что я делаю не так?

1 Ответ

1 голос
/ 13 апреля 2020

Вам нужно использовать Declarables.

См. Документы: https://docs.spring.io/spring-amqp/docs/2.2.5.RELEASE/reference/html/#collection -декларация

Обратите внимание на ВАЖНЫЙ блок:

В версиях до 2.1 вы могли объявлять несколько экземпляров Declarable, определяя bean-компоненты типа Collection<Declarable>. Это может вызвать нежелательные побочные эффекты в некоторых случаях, потому что администратор должен выполнять итерации по всем Collection<?> компонентам. Эта функция теперь отключена в пользу Declarables, как обсуждалось ранее в этом разделе. Вы можете вернуться к предыдущему поведению, установив свойство RabbitAdmin с именем declareCollections в true.

...