RabitMQ之主题交换机(异步处理)和扇形交换机(广告)

主题交换机(Topic Exchange)

异步处理的流程
在这里插入图片描述
1.队列与交换机的绑定

package com.zking.provider.config;


import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration//代替xml配置文件
public class RabbitmqTopicConfig {
    @Bean//<bean id="directQueue1"></bean>
    public Queue topicQueue1() {//创建一个队列
        return new Queue("topicQueue1", true);//true 持久化消息
    }

    @Bean//<bean id="directQueue1"></bean>
    public Queue topicQueue2() {//创建一个队列
        return new Queue("topicQueue2", true);//true 持久化消息
    }



    @Bean
    public TopicExchange topicExchange1(){//创建一个交换机
        return new TopicExchange("topicExchange1");
    }

    //user.email 匹配user.*
    //user.* user.letter 也能匹配
    @Bean
    public Binding BindingTopicQueue1 (){
        return BindingBuilder.bind(topicQueue1()).to(topicExchange1()).with("user.*");
    }


    @Bean
    public Binding BindingTopicQueue2 (){
        return BindingBuilder.bind(topicQueue2()).to(topicExchange1()).with("user.letter");
    }

}

2.向队列发送消息

@GetMapping("/send2")
    @ResponseBody
    public String send2(String uid,String routingKey) {
        System.out.println("uid为"+uid+"的用户注册成功");
        Map<String, Object> map = getMap();
        map.put("uid",uid);
        rabbitTemplate.convertAndSend("topicExchange1", routingKey, map);
//        rabbitTemplate.convertAndSend("directExchange1", routingKey, map);
        return "ok";
    }
package com.zking.consumer.mq;

import org.apache.commons.logging.Log;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.util.Map;




@Component
@RabbitListener(queues = "topicQueue1")
public class TopicEmailReceiver {
    //处理消息
    @RabbitHandler
    public void process(Map map) {
        String uid=(String) map.get("uid");
        System.out.println("向用户uid为: "+uid+"的用户发送邮件");
		
        
    }
}
@Component
@RabbitListener(queues = "topicQueue2")
public class TopicEmailReceiver {
    //处理消息
    @RabbitHandler
    public void process(Map map) {
        String uid=(String) map.get("uid");
        System.out.println("向用户uid为: "+uid+"的用户发送短信");
		
        
    }
}

测试图

在这里插入图片描述
在这里插入图片描述

扇形交换机

1.交换机与对列的绑定

package com.zking.provider.config;


import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration//代替xml配置文件
public class RabbitmqFanoutConfig {
    @Bean//<bean id="directQueue1"></bean>
    public Queue fanoutQueue1() {//创建一个队列
        return new Queue("fanoutQueue1", true);//true 持久化消息
    }

    @Bean//<bean id="directQueue1"></bean>
    public Queue fanoutQueue2() {//创建一个队列
        return new Queue("fanoutQueue2", true);//true 持久化消息
    }

    @Bean//<bean id="directQueue1"></bean>
    public Queue fanoutQueue3() {//创建一个队列
        return new Queue("fanoutQueue3", true);//true 持久化消息
    }


    @Bean
    public FanoutExchange fanoutExchange1(){//创建一个交换机
        return new FanoutExchange("fanoutExchange1");
    }

    //user.email 匹配user.*
    //user.* user.letter 也能匹配
    @Bean
    public Binding BindingFanoutQueue1 (){
        return BindingBuilder.bind(fanoutQueue1()).to(fanoutExchange1());
    }


    @Bean
    public Binding BindingFanoutQueue2 (){
        return BindingBuilder.bind(fanoutQueue2()).to(fanoutExchange1());
    }

    @Bean
    public Binding BindingFanoutQueue3(){
        return BindingBuilder.bind(fanoutQueue3()).to(fanoutExchange1());
    }

}

2.像队列发送消息

  @GetMapping("/send3")
    public String send3() {
        Map<String, Object> map = getMap();
        rabbitTemplate.convertAndSend("fanoutExchange1",null, map);
//        rabbitTemplate.convertAndSend("directExchange1", routingKey, map);
        return "ok";
    }

3、消费者消费消息

//同上交换机一致,就修改队列名

在这里插入图片描述

总结

1.交换机与队列的基本工作流程
在这里插入图片描述
2.三种交换机的区别
2.1直连交换机与主题交换机区别在于直连交换机不能有像主题交换机有复杂的路由键(区别看异步处理代码)
2.2而扇形交换机无路由键

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值