【问题标题】:How to setup multiple topics in a RabbitMQ Java config class using Spring Framework?如何使用 Spring Framework 在 RabbitMQ Java 配置类中设置多个主题?
【发布时间】:2015-10-12 17:55:24
【问题描述】:

我正在尝试使用 Spring Framework 创建一个 RabbitMQ 配置类。该文档没有说明如何在 TopicExchange 中设置多个主题。我怎么做?到目前为止,我有这个 Java 代码,但我不清楚如何在下面的绑定方法中设置多个主题,因为它只返回一个绑定。如果我需要多个主题,我是否不需要多个绑定?

@Configuration
@EnableRabbit
public class MessageReceiverConfiguration {

    final static String queueName = "identity";
    final static String topic1 = "NewUserSignedUp";
    final static String topic2 = "AccountCreated";

    @Autowired
    RabbitTemplate rabbitTemplate;

    @Bean
    Queue queue() {
        return new Queue(queueName, false);
    }

    @Bean
    TopicExchange exchange() {
        return new TopicExchange("DomainEvents");
    }   

    @Bean
    Binding binding(Queue queue, TopicExchange exchange) {
        // How to setup multiple topics?
        return BindingBuilder.bind(queue).to(exchange).with(topic1);
    }

    @Bean
    SimpleMessageListenerContainer container(ConnectionFactory connectionFactory, MessageListenerAdapter listenerAdapter) {

        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();

        container.setConnectionFactory(connectionFactory);
        container.setQueueNames(queueName);
        container.setMessageListener(listenerAdapter);
        container.setAcknowledgeMode(AcknowledgeMode.AUTO);

        return container;
    }

    @Bean
    MessageReceiver receiver() {
        return new MessageReceiver();
    }

    @Bean
    MessageListenerAdapter listenerAdapter(MessageReceiver receiver) {
        return new MessageListenerAdapter(receiver, "receiveMessage");
    }    

}

【问题讨论】:

    标签: java spring rabbitmq


    【解决方案1】:

    您可以通过更改Binding 函数来定义多个绑定,以返回一个列表而不是单个Binding 对象。

    @Bean
    List<Binding> bindings() {
    
        return Arrays.AsList(BindingBuilder.bind(queue()).to(exchange()).with(topic1), 
                            BindingBuilder.bind(queue()).to(exchange()).with(topic2));
    }
    

    提示:您不需要将队列和交换作为方法参数传递。可以直接引用bean方法来传递exchange和queue的信息。

    Refer documentation 了解更多详情。

    【讨论】:

    • 这不适用于我的项目,但是当我单独创建所有构建器时它可以工作。你对此有何评论?我正在使用 spring boot 2.1.2.RELEASE
    • @MustafaGüven 在 2.1.0.RELEASE 中,我使用Declarables 做到了这一点,这里建议:baeldung.com/rabbitmq-spring-amqp
    【解决方案2】:

    List&lt;Binding&gt; bindings() 不受 Spring Boot 2.+ 版本的支持。 这个有效;

    @Bean
    public Declarables bindings() {
    
        return new Declarables(
                BindingBuilder
                        .bind(bookingAddQueue())
                        .to(bookingExchange())
                        .with("add")
                        .noargs(),
                BindingBuilder
                        .bind(bookingEditQueue())
                        .to(bookingExchange())
                        .with("edit")
                        .noargs());
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-16
      • 1970-01-01
      • 1970-01-01
      • 2013-02-07
      • 1970-01-01
      • 2014-02-10
      • 1970-01-01
      • 2017-07-01
      相关资源
      最近更新 更多