Spring Cloud Stream-声明Rabitmq的目标和组属性

时间:2018-12-11 12:54:11

标签: spring-cloud-stream

我有生产者和消费者的春季云流应用程序, 我们不知道我们将首先启动哪个应用程序。它可以是生产者或消费者。

当我们在application.properties中为生产者和使用者应用程序声明有关destination(Exchange),group(queue)的属性时,如果destination(Exchange),group(queue)已经不存在,则将是这种方式尝试再次创建,使用现有的创建,否则创建。

1。如果生产者首先启动,则需要创建目标和组,并且消费者将使用相同的目标和组,而无需再次创建。

2。如果使用者首先启动,则需要创建目标和组,并且生产者将使用相同的目标和组,而无需再次创建。

生产者和消费者的application.properties都需要满足以上要求。

制作人:

public interface FoodOrderPublisher {

      String OUTPUT = "foodOrderPublishChannel";

      @Output(OUTPUT)
      MessageChannel create();
}

spring.cloud.stream.bindings.foodOrderPublishChannel.destination=foodOrders
spring.cloud.stream.bindings.foodOrderPublishChannel.group=foodOrdersQueue
spring.cloud.stream.bindings.foodOrderPublishChannel.producer.requiredGroups=foodOrdersQueue
spring.cloud.stream.default.contentType=application/json

消费者:

spring.cloud.stream.bindings.foodOrderRecieveChannel.destination=foodOrders
spring.cloud.stream.bindings.foodOrderRecieveChannel.group=foodOrdersQueue

public interface FoodOrderConsumer {

    String INPUT = "foodOrderRecieveChannel";

    @Input(INPUT)
    SubscribableChannel receive();

}

使用上面的代码:

生产者应用程序可以通过创建目的地和组来正确启动,其中作为消费者,它给出以下错误:

  

2018-12-11 20:43:41.607 INFO 1980 --- [main] c.s.b.r.p.RabbitExchangeQueueProvisioner:声明入站队列:foodOrders.foodOrdersQueue,绑定到:foodOrders   2018-12-11 20:43:41.739 WARN 1980 --- [main] osamqp.rabbit.core.RabbitAdmin:未能声明交换:交换[name = foodOrders,type = topic,持久性= true,autoDelete = false internal = false,arguments = {}],继续... org.springframework.amqp.AmqpIOException:java.io.IOException   2018-12-11 20:43:41.753错误1980--[127.0.0.1:5672] c.r.c.impl.ForgivingExceptionHandler:发生意外的连接驱动程序错误

java.net.SocketException:套接字已关闭

1 个答案:

答案 0 :(得分:0)

设置requiredGroups property on the producer side

  

必填组

     

生产者必须确保向其传递消息的组的逗号分隔列表,即使它们是在创建消息之后开始的(例如,通过在RabbitMQ中预先创建持久队列)。

  

无需尝试再次创建。

双方都将尝试创建,但是第二步实际上不执行任何操作,因为该操作是幂等的。