发布订阅模式:就是将消息发送给不同类型的消费者。做到发布一次,消费多个。比如用户注册手机和邮箱,注册完会向邮箱和手机发送注册结果,利用MQ实现业务异步处理,如果是用工作队列的话,就会声明一个注册信息队列。注册完成之后生产者会向队列提交一条注册数据,消费者取出数据同时向邮箱以及手机号发送两条消息。但是实际上邮箱和手机号信息发送实际上是不同的业务逻辑,不应该放在一块处理。这个时候就可以利用发布/订阅模式将消息发送到转换机(EXCHANGE),声明两个不同的队列(邮箱、手机),并绑定到交换机。这样生产者只需要发布一次消息,两个队列都会接收到消息发给对应的消费者。
发布者(生产者)—>(交换机)—>两个队列—>两个消费者
生产者
1 | public class Sender |
消费者1
1 | public class Recver1 |
消费者2
1 | public class Recver2 |
运行结果
1 | 1、消费者1:发布订阅模式的消息 |
总结:
- 该模式下生产者并不是直接操作队列,而是将数据发送给交换机,由交换机将数据发送给与之绑定的队列。从运行结果中可以看到,两中类型的消费者(Email,Phone)都收到相同数量的消息。
- 该模式必须声明交换机,并且设置模式:channel.exchangeDeclare(EXCHANGE_NAME, “fanout”) fanout指分发模式(将每一条消息都发送到与交换机绑定的队列。
- 队列必须绑定交换机:channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, “”);