gpt4 book ai didi

spring-cloud - Spring Cloud Stream 与 Rabbit Binder - 源/接收器队列名称不匹配

转载 作者:行者123 更新时间:2023-12-01 21:50:04 25 4
gpt4 key购买 nike

最近,我开始使用 Spring Cloud Stream 和 RabbitMQ Binder。

如果我正确理解了当两个服务想要传递消息时的所有内容,一个应该配置用于发送消息,另一个应该配置接收器用于接收消息 - 两者都应该使用相同 channel

我有一个名为 testchannel channel 。不过,我注意到 source 创建了 RabbitMQ 绑定(bind):

  • 交换测试 channel
  • 路由键testchannel
  • 队列testchannel.default(持久),

sink创建RabbitMQ绑定(bind)时:

  • 交换测试 channel
  • 路由键#,
  • 队列testchannel.anonymous.RANDOM_ID(专有)。

为了简洁起见,我跳过了前缀。

现在当我运行这两个应用程序时。第一个将消息发送到 testchannel 交换,然后路由到两个队列(我假设路由键是 testchannel)。第二个应用程序使用随机队列中的消息,但从不使用默认队列中的消息。

我的另一个问题是 - 第二个应用程序仅使用接收器,但它也为输出 channel 创建绑定(bind),默认情况下为输出,因为我没有指定任何东西。

我使用相同的 Gradle 脚本构建这两个应用程序:

buildscript {
ext {
springBootVersion = '1.3.2.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}

apply plugin: 'java'
apply plugin: 'spring-boot'

repositories {
mavenCentral()
maven { url 'https://repo.spring.io/snapshot' }
maven { url 'https://repo.spring.io/milestone' }
}

dependencies {
compile(
'org.springframework.cloud:spring-cloud-starter-stream-rabbit',
)
}

dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:Brixton.BUILD-SNAPSHOT"
}
}

第一个应用程序属性:

server.port=8010
spring.cloud.stream.binder.rabbit.default.prefix=z.
spring.cloud.stream.bindings.input=start
spring.cloud.stream.bindings.output=testchannel
spring.rabbitmq.addresses=host1:5672,host2:5672
spring.rabbitmq.username=user
spring.rabbitmq.password=psw

第一个应用程序源代码:

@EnableBinding(Processor.class)
...
@ServiceActivator(inputChannel = Processor.INPUT, outputChannel = Processor.OUTPUT)
public byte[] handleIncomingMessage(byte[] payload) {}

第二个应用程序属性:

server.port=8011
spring.cloud.stream.binder.rabbit.default.prefix=z.
spring.cloud.stream.bindings.input=testchannel
spring.rabbitmq.addresses=host1:5672,host2:5672
spring.rabbitmq.username=user
spring.rabbitmq.password=psw

第二个应用程序源代码:

@EnableBinding(Sink.class)
...
@ServiceActivator(inputChannel = Sink.INPUT)
public void handleIncomingMessage(byte[] payload) {}

所以我的问题是。

  • 接收器不应该使用相同的 channel 并因此使用相同的代理队列吗?实现这一目标的正确配置是什么? (我的目标是拥有多个接收器服务实例,但只有一个应该使用消息。)
  • 当我仅使用接收器时,框架是否应该创建输出绑定(bind)?如果是,如何禁用它。

最佳答案

默认;每个消费者都有自己的队列;这是一个发布/订阅场景。

有一个消费者的概念,因此您可以让多个实例竞争来自同一队列的消息。

绑定(bind)生产者时,会绑定(bind)一个默认队列。

如果您想订阅default群组;您必须设置组:

spring.cloud.stream.bindings.input.group=default

如果您不提供组,您将获得一个独占的自动删除队列。

编辑

由于默认队列是持久的,因此您还应该设置

spring.cloud.stream.bindings.input.durableSubscription=true

避免消费者绑定(bind)时出现警告,并在消费者先绑定(bind)且队列尚不存在时确保队列是持久的。

关于spring-cloud - Spring Cloud Stream 与 Rabbit Binder - 源/接收器队列名称不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35215810/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com