是一种点对点,实现发布/订阅标准的交换器。Producer发送消息到RabbitMQ中,MQ中的Direct交换器接受到消息后,会根据Routing Key来决定这个消息要发送到哪一个队列中。Consumer则负责注册一个队列监听器,来监听队列的状态,当队列状态发生变化时,消费消息。注册队列监听需要提供交换器信息,队列信息和路由键信息。
这种交换器通常用于点对点消息传输的业务模型中。如电子邮箱。
producer全局配置文件
spring.application.name=direct-producer
# 必要配置
# 配置rabbitmq链接相关信息。key都是固定的。是springboot要求的。
# rabbitmq安装位置
spring.rabbitmq.host=192.168.1.29
# rabbitmq的端口
spring.rabbitmq.port=5672
# rabbitmq的用户名
spring.rabbitmq.username=xxf
# rabbitmq的用户密码
spring.rabbitmq.password=123456
# 可选配置
# 配置producer中操作的Queue和Exchange相关信息的。key是自定义的。为了避免硬编码。
# exchange的命名。交换器名称可以随意定义。
mq.config.exchange=log.direct
# 路由键, 是定义某一个路由键。 info级别日志使用的queue的路由键。
mq.config.queue.info.routing.key=log.info.routing.key
# 路由键,error级别日志使用的queue的路由键。
mq.config.queue.error.routing.key=log.error.routing.key
Consumer全局配置
spring.application.name=direct-consumer
server.port=8081
spring.rabbitmq.host=192.168.1.29
spring.rabbitmq.port=5672
spring.rabbitmq.username=xxf
spring.rabbitmq.password=123456
# 自定义配置。 配置交换器exchange、路由键routing-key、队列名称 queue name
# 交换器名称
mq.config.exchange=log.direct
# info级别queue的名称
mq.config.queue.info=http://log.info
# info级别的路由键
mq.config.queue.info.routing.key=log.info.routing.key
# error级别queue的名称
mq.config.queue.error=log.error
# error级别的路由键
mq.config.queue.error.routing.key=log.error.routing.key
主题交换器,也称为规则匹配交换器。是通过自定义的模糊匹配规则来决定消息存储在哪些队列中。当Producer发送消息到RabbitMQ中时,MQ中的交换器会根据路由键来决定消息应该发送到哪些队列中。Consumer同样是注册一个监听器到队列,监听队列状态,当队列状态发生变化时,消费消息。注册监听器需要提供交换器信息,队列信息和路由键信息。
广播交换器。这种交换器会将接收到的消息发送给绑定的所有队列中。当Producer发送消息到RabbitMQ时,交换器会将消息发送到已绑定的所有队列中,这个过程交换器不会尝试匹配路由键,所以消息中不需要提供路由键信息。Consumer仍旧注册监听器到队列,监听队列状态,当队列状态发生变化,消费消息。注册监听器需要提供交换器信息和队列信息。
前面内容,如果consumer未启动,而producer发送了消息。则消息会丢失。
如果consumer先启动,创建queue后,producer发送消息可以正常消费。那么当所有的consumer宕机的时候,queue会auto-delete,消息仍旧会丢失。
这种情况,消息不可靠。有丢失的可能。
Rabbitmq的消息可靠性处理,分为两部分。
1 - 消息不丢失。当consumer全部宕机后,消息不能丢失。 持久化解决
2 - 消息不会错误消费。当consumer获取消息后,万一consumer在消费消息的过程中发生了异常,如果rabbitmq一旦发送消息给consumer后立刻删除消息,也会有消息丢失的可能。 确认机制解决
@Queue注解中的属性 - autoDelete:当所有消费客户端连接断开后,是否自动删除队列 。true:删除 false:不删除
@Exchange注解中的属性 - autoDelete:当交换器所有的绑定队列都不再使用时,是否自动删除交换器。true:删除 false:不删除
有帮助到你的点赞、收藏和关注一下吧
需要更多教程,微信扫码即可
别忘了扫码领资料哦【高清Java学习路线图】
和【全套学习视频及配套资料】