| 目前市场上有多种消息中间件,如果要全部掌握会比较苦难,使用Cloud Stream则可以屏蔽底层消息中间件的差异,降低切换成本,统一消息的编程模型 |
| 目前Stream仅支持RabbitMQ、Kafka |
| 消息提供者方使用Stream的Source创建通道Output传递message到RabbitMQ |
| RabbitMQ接收并存储message |
| 消息消费者方使用Stream的Sink创建通道Input接收RabbitMQ传递过来的message |

| rabbitmq环境已搭建好,新建cloud-stream-rabbitmq-provider8801,作为消息提供者 |
| pom中拉取stream-rabbit依赖,yml中配置端口、服务名、rabbitmq配置、消息通道配置、eureka配置,启动类 |
| 编写业务类:定义消息通道output,通过消息通道将message发送到rabbitmq |
| 测试:启动eureka模块、提供者模块、rabbitmq服务,提供者发送的message会在rabbitmq接收后显示 |
| 新建cloud-stream-rabbitmq-consumer8802,作为消费者接受模块,拉取依赖,yml配置除了消息通道配置其他和8801一致,启动类配置 |
| 编写业务:编写一个监听类,监听接收到的消息 |
| 测试:提供者模块8801发送的消息可被消费者模块8802接收 |
| 新建cloud-stream-rabbitmq-consumer8803,作为消费者接受模块;这时8801发送消息时,8802和8803都会接收到相同的消息 |
| 8802和8803若是一个集群,8802、8803应该是同一个group(组),消息应该只能被其中一个消费者模块接收一次;如果是不同的组,则都可以接收到消息;目前两个消费者模块都能接收消息,是因为两个模块被认为是不同的组 |
| 为消费者模块分组,在消费者模块的yml中配置如下: |
| bindings: |
| input: |
| destination: studyExchange |
| content-type: application/json |
| binder: defaultRabbit |
| group: atguiguA |
| |
| 若8802设置成A组,8803设置为B组,这时是不同的组,依然会存在重复消费,若都设置成A组,则可避免重复消费 |
| 消费者模块8802设置A组,8803不设置组,提供者模块8801发送消息后,8802、8803启动,这时8802可接收到消息,8803则不能接收,说明分组可持久化消息 |
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术