rabbitmq-----发布订阅模式

上篇我们已经讲过了工作模式和简单模式的用法。而这节我们就要开始讲一下后面三种的第一种,在我们平常开发中,其实用的比较多的是后面的这三种。

发布订阅模式:英文叫Publish/Subscribe,发布订阅模式也称为广播模式,在exchange下属于fanout模式。广播,大家应该都知道吧,在mq中,其实就是一个生产者对应n个消费者,可能仔细的人就会发现我们的工作模式也是一对多的,那么这两者有什么关系呢?
发布订阅模式的结构图:
这里写图片描述
这个x表示的就是我们之前所说的交换机,他并不是将消息直接发送给队列的,而是通过交换机,然后通过交换机绑定队列,在发送到队列。从这个图就发现了,这个模式和工作模式的区别吧,一个是发到多个消息队列,一个是只发到一个队列,多个消费者去消费的。

可能有人会问这种模式有什么用呢?
举个最简单的列子吧:大家应该知道公众号吧,如果你自己也玩过公众号就会发现,你发送一个东西的时候,所有关注你的人都能收到你的消息,这种如果在mq中的实现其实就可以使用这种模式,生产者其实就可以理解为微信的公众号,然后消费者可以理解为用户,然后关注可以理解为用户绑定的队列。这样你发送东西的时候,你会将数据发送到你粉丝的队列中,然后不同的粉丝通过不同的队列去取数据,这样就能达到公众号的效果。
而在代码中如何去实现这种模式呢?上一节我们是直接使用原生的代码去实现两种工作模式的,而我们这边会教大家在spring boot中使用mq。并实现这三种模式。

springboot中实现mq的发布订阅模式

1、首先是引入mq的依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

2、配置mq的连接配置,我们可以直接在application的配置文件去配置mq的配置

spring.application.name=mq-queqe
server.port=1111
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

到此为止,我们的mq的配置就完成了
3、去实现具体的业务逻辑,首先我们定义一个发送消息的接口

  private static String EXCHANGE_NAME="hello111";
    @Autowired
    AmqpTemplate amqpt;

    @RequestMapping(value="test")
    public void test() throws InterruptedException{

        for(int i=0;i<10;i++){
            Thread.sleep(i*20);
            amqpt.convertAndSend(EXCHANGE_NAME,"fanout", "hello word"+i);
        }
    System.err.println("消息发送成功");
    }

4、同时我们还要去写一个配置类,因为到目前为止我们消息是能够发送成功,但是接收消息的呢,消息应该怎么发送呢,我们并没有指定,所以我们还需要指定发送的地方。


@Configuration
public class Confi {
      private static String EXCHANGE_NAME="hello111";
      //声明两个队列
    @Bean
    public Queue queue(){
        return new Queue("hello");
    }

    @Bean
    public Queue queue1(){
        return new Queue("hello1");
    }
    //声明一个fanout的交换机
    @Bean
    public FanoutExchange fanoutExchange(){
        return new FanoutExchange(EXCHANGE_NAME);   
    }
    //将队列和交互机进行绑定
    @Bean
    public Binding bindfanout(Queue queue,FanoutExchange fanoutExchange){
        return BindingBuilder.bind(queue).to(fanoutExchange);

    }

    @Bean
    public Binding bindfanout1(Queue queue1,FanoutExchange fanoutExchange){
        return BindingBuilder.bind(queue1).to(fanoutExchange);

    }
}

到这步的时候,我们就完成了消息的发送,以及该发送到什么位置。
5、接下来我们就需要定义消费者。


@Service
@RabbitListener(queues="hello") //这个队列就是我们之前定义的队列名称,监听hello队列的消息
public class Receive1 {

    @RabbitHandler 
    public void receive(String message) throws InterruptedException{

        System.err.println("1:收到消息"+message);

    }
}

另一个消费者为

@Service
@RabbitListener(queues="hello1")
public class Receive2 {

    @RabbitHandler
    public void receive(String message) throws InterruptedException{
        System.err.println("2收到消息:"+message);
    }
}

然后我们启动我们的项目,并在浏览器去访问接口,让他发送消息,这时候我们可以看到控制台出现两个消费者消费的消息,到此我们的广播模式也实现完成了。
这里写图片描述

但是我们之前说过有个routingKey的东西,其实这个routingKey是用于交换机和队列的绑定,而我们fanout模式是算比较特殊的把,他不是通过routingKey来使队列和交互机连接,而是直接通过交换机和队列绑定,但是之后两种模式会基于routingKey来实现交换机和队列的绑定

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值