上两篇文章中,介绍了Provider端利用消息管道向rabbitmq中发送消息,Consumer端监听rabbitmq中消息,但是如果Consumer端有两个模块,Stream默认这两个模块属于不同分组,那么不同分组可以重复监听rabbitmq中的消息,效果如图:
8801(Provider端消息发送)
8802(Consumer端消息接收)
8803(Consumer端消息接收)
这里可以看到,8801向rabbitmq中发送了两个消息,由于我们没有在8802和8803配置文件中添加分组,系统默认为分为了不同的组,而不同的组均可以接收rabbitmq中的消息,如果放在实际应用场景中,会出现多次消费记录,我们应该避免该情况发生,因此,Stream中的分组概念就解决了该问题。
具体分组步骤:
说明,我们认为将8802和8803分为相同组,同一组内模块属于竞争关系,就只有一个模块能接收rabbitmq中消息。
- 在8802,8803配置文件(application.yml)中添加
group:atguiguA
8802配置文件:
server:
port: 8802
spring:
application:
name: cloud-stream-consumer
cloud:
stream:
binders: # 在此处配置要绑定的rabbitmq的服务信息;
defaultRabbit: # 表示定义的名称,用于于binding整合
type: rabbit # 消息组件类型
environment: # 设置rabbitmq的相关的环境配置
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
bindings: # 服务的整合处理
input: # 这个名字是一个通道的名称
destination: studyExchange # 表示要使用的Exchange名称定义
content-type: application/json # 设置消息类型,本次为对象json,如果是文本则设置“text/plain”
binder: defaultRabbit # 设置要绑定的消息服务的具体设置
group: atguiguA #***************************************************************
eureka:
client: # 客户端进行Eureka注册的配置
service-url:
defaultZone: http://localhost:7001/eureka
instance:
lease-renewal-interval-in-seconds: 2 # 设置心跳的时间间隔(默认是30秒)
lease-expiration-duration-in-seconds: 5 # 如果现在超过了5秒的间隔(默认是90秒)
instance-id: receive-8802.com # 在信息列表时显示主机名称
prefer-ip-address: true # 访问的路径变为IP地址
8803配置文件:
server:
port: 8803
spring:
application:
name: cloud-stream-consumer
cloud:
stream:
binders: # 在此处配置要绑定的rabbitmq的服务信息;
defaultRabbit: # 表示定义的名称,用于于binding整合
type: rabbit # 消息组件类型
environment: # 设置rabbitmq的相关的环境配置
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
bindings: # 服务的整合处理
input: # 这个名字是一个通道的名称
destination: studyExchange # 表示要使用的Exchange名称定义
content-type: application/json # 设置消息类型,本次为对象json,如果是文本则设置“text/plain”
binder: defaultRabbit # 设置要绑定的消息服务的具体设置
group: atguiguA #****************************************************************
eureka:
client: # 客户端进行Eureka注册的配置
service-url:
defaultZone: http://localhost:7001/eureka
instance:
lease-renewal-interval-in-seconds: 2 # 设置心跳的时间间隔(默认是30秒)
lease-expiration-duration-in-seconds: 5 # 如果现在超过了5秒的间隔(默认是90秒)
instance-id: receive-8803.com # 在信息列表时显示主机名称
prefer-ip-address: true # 访问的路径变为IP地址
这样,8802和8803分为了atguiguA
相同的组。
- 测试效果
在浏览器中发送8001中的请求。
8801:
8002:
8003:
同样的,rabbitmq中可以看到被分为了一组: