当我们在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:套接字已关闭
答案 0 :(得分:0)
设置requiredGroups
property on the producer side。
必填组
生产者必须确保向其传递消息的组的逗号分隔列表,即使它们是在创建消息之后开始的(例如,通过在RabbitMQ中预先创建持久队列)。
。
无需尝试再次创建。
双方都将尝试创建,但是第二步实际上不执行任何操作,因为该操作是幂等的。