java - Spring Cloud Stream RabbitMQ 多个接收者

标签 java spring spring-boot rabbitmq spring-cloud-stream

我很难掌握 RabbitMQ 和 Spring Cloud Stream 如何协同工作的知识。我想要做的是以下内容(基本解释):

我有一个生成消息的生产者,这些消息类似于:SendEmail、ReceiveEmail 和 ErrorOccurred。这些将继续在消息总线上。 然后我有 3 个消费者。一个 LogService 一个 Emailservice 和一个 ParserService

EmailService 将获取所有 Email 消息,LogService 将获取 ErrorOccurred(由其他生成的生产者)和 EmailSend 消息。最后,ParserService 只会收到 ReceiveEmail 消息。

我似乎无法使用 Spring Cloud Stream 配置它。我可以从一个生产者向一个接收者发送和接收单个事件,从一个生产者向多个订阅者发送和接收单个事件(一个主题、多个队列但没有通配符)。

spring:
  rabbitmq:
    host: localhost
    username: guest
    password: guest
  cloud:
    stream:
      bindings:
        output: # <-- Question 1
          destination: # <-- Question 2

与标准的Source.class接口(interface)绑定(bind)。

EmailService:

spring:
  rabbitmq:
    host: localhost
    username: guest
    password: guest
  cloud:
    stream:
      bindings:
        input:
          destination: # <-- Question 3

LogService 同上。

问题1:我只定义了一个输出,明明需要2个?但是我不能使用“输入”作为 channel 名称,对吗?我需要使用 Output("CHANNEL NAME HERE") 配置我自己的 channel 名称。但是这个 channel 名称是什么意思?我没有看到 channel 名称再次出现在 RabbitMQ 网络界面或其他任何地方。这只是应用程序内部命名吗?

问题2:据我了解,这是交易所名称。如果我正确阅读了文档,我需要一个主题类型的 Email 消息交换,因为我有 3 个接收者。那我还有3个单独的队列吗?但是我如何配置 1 个队列仅接收 EmailReceived,1 个队列接收所有消息,1 个队列接收 EmailSend 消息?

问题 3:我是否需要为每个要发送的不同事件进行交换?我不应该能够订阅所有 email.* 事件吗?如果我那样使用它,我会创建一个具有该确切名称的队列和一个具有该确切名称的主题。据我所知,这是不对的。

我想这样做,https://www.rabbitmq.com/tutorials/tutorial-five-spring-amqp.html .但问题是,他们使用基本的 RabbitMQ Spring AMQP,而我选择使用 Spring Cloud Stream(因为它被宣传为进行微服务通信等的工具)。

我应该使用 SCS 还是应该使用 Spring-AMQP 库?如果是这样,我应该如何配置呢?如果我需要解释更多,请要求任何澄清。提前致谢!

最佳答案

在生产者方面,您只需要一个目的地;设置 routingKeyExpression根据消息中的某些内容(例如 header - routing-key-expression=headers[route] )路由到 3 个队列之一。

您还可以让多个输出 channel 指向同一个目的地(但使用不同的 - 文字 - 路由键表达式 'email.foo' )。

在消费者方面;你可以使用相同的目的地,但每个消费者都会有一个队列绑定(bind)到该交换机,在 bindingRoutingKey 旁边例如,email.# .

参见 the documentation .

关于java - Spring Cloud Stream RabbitMQ 多个接收者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52759898/

相关文章:

java - Spring 2.0 和 2.3 版本的区别

java - 如何集成EvoSuite测试用例生成工具

java - java线程的共享变量

java - 在bash中编译并启动java文件而不保存编译文件

java - 如何将 url 作为路径参数传递?在 JAX-RS @Path 中

java - NoClassDefFound错误: com/google/api/gax/grpc/GrpcStatusCode

java - org.springframework.web.client.RestClientException : No HttpMessageConverter for java. util.HashMap 中出现错误

java - Spring REST - 正在下载损坏/空白文件

java - 打包后的 Spring Boot 应用程序的相对路径在哪里

java - @KafkaListener 不会读取以前的消息,即使它们没有被确认,除非应用程序重新启动