Sringboot整合整合RabbitMQ(三):发布订阅(三):发布订阅
((Publish/Subscribe))
在本篇教程中,我们要做的跟之前完全不一样 —— 分发一个消息给多个消费者(consumers)。这种模式被称为” 发布 / 订
阅”。
交换器(Exchanges)
在本教程的前面部分,我们发送和接收到队列中的消息,现在是时候在 RabbitMQ 中引入完整的消息传递模式了。
让我们快速回顾一下之前了解的内容:
生产者(producer):发送消息的程序
队列(queue):存储消息的缓冲器
消费者(consumer):接收消息的程序
RabbitMQ 消息模型的核心理念是:发布者(producer)不会直接发送任何消息给队列。事实上,发布者(producer)甚至不
知道消息是否已经被投递到队列。
发布者(producer)只需要把消息发送给一个交换器(exchange)。交换器非常简单,它一边从发布者方接收消息,一边把
消息推送到队列。交换器必须知道如何处理它接收到的消息,是应该推送到指定的队列还是多个队列,或者是直接忽略消息。
这些规则是通过交换器类型(exchange type)来定义的。
有几个可供选择的交换器类型:direct, topic, headers 和 fanout。我们在这里主要说明最后一个 ——fanout。fanout exchange
很简单,你可能从名字上就能猜测出来,它把消息发送给它所知道的所有队列。这正是我们所需要的。
先创建一个 fanout 类型的交换器,命名为”tut.fanout”
@Profile({"tut3", "pub-sub"})
@Configuration
public class Tut3Config {
/**
* 定义一个 Exchange
*
* @return FanoutExchange
*/
@Bean
public FanoutExchange queue() {
return new FanoutExchange("tut.fanout");
}
/**
* 消费者一端的配置:queues、bindings
*/
@Profile("receiver")
private static class ReceiverConfig {
@Bean
public Queue autoDeleteQueue1() {
return new AnonymousQueue();
}
@Bean
public Queue autoDeleteQueue2() {
return new AnonymousQueue();
}
@Bean
public Binding binding1(FanoutExchange fanout, Queue autoDeleteQueue1) {
return BindingBuilder.bind(autoDeleteQueue1).to(fanout);
}
@Bean
public Binding binding2(FanoutExchange fanout, Queue autoDeleteQueue2) {
return BindingBuilder.bind(autoDeleteQueue2).to(fanout);
}
@Bean
public Tut3Receiver receiver() {
return new Tut3Receiver();
}