Как связать topi c с Spring AMQP, только если существует обмен? - PullRequest
0 голосов
/ 30 января 2020

Мне нужно привязать очередь к обмену topi c, но:

  1. Только если topi c существует
  2. Если существует topi c, использовать существующие настройки (например, длительный, автоудаление и т. д. c)

Причина в том, что мне нужно стороннее приложение для создания обмена с любыми настройками, которые они хотят использовать, я не Я не хочу изменять настройки topi c.

Я собрал код ниже, прочитав учебник RabbitMQ Spring AMQP. Это работает, но создает обмен, если не существует.

@Configuration
public class BeanConfiguration {
    @Bean
    public TopicExchange topic() {
        return new TopicExchange("MyTopicExchange", true, false);
    }

    @Bean
    public Queue queue() {
        return QueueBuilder.durable("MyQueue").build();
    }

    @Bean
    public Binding binding(TopicExchange topicExchange, Queue queue) {
        return BindingBuilder.bind(queue).to(topicExchange).with("purchases.*");
    }
}

Ответы [ 2 ]

0 голосов
/ 31 января 2020

Я нашел способ, используя метод суперкласса setShouldDeclareFalse:

    @Bean
    public TopicExchange topic() {
        TopicExchange topicExchange = new TopicExchange("MyTopicExchange", true, false);
        topicExchange.setShouldDeclare(false);
        return topicExchange;
    }

0 голосов
/ 31 января 2020

Пропустить компонент объявления обмена и игнорировать ошибку объявления привязки.

@SpringBootApplication
public class So59994152Application {

    public static void main(String[] args) {
        SpringApplication.run(So59994152Application.class, args);
    }

    @Bean
    public Queue queue() {
        return QueueBuilder.durable("MyQueue").build();
    }

    @Bean
    public Binding binding(Queue queue, AmqpAdmin admin) {
        ((RabbitAdmin) admin).setIgnoreDeclarationExceptions(true);
        return new Binding("MyQueue", DestinationType.QUEUE, "MyTopicExchange", "purchases.*", null);
    }

    @Bean
    public ApplicationRunner runner(CachingConnectionFactory cf) {
        return args -> {
            cf.createConnection();
            cf.destroy();
        };
    }

}

Если вы не используете Spring Boot; установите свойство admin в компоненте администрирования.

...