一、简单回顾RabbitMQ为什么是高级队列
二、四种交换机类型与扇形交换机
Direct exchange(直连交换机)
Fanout exchange(扇型交换机)
Topic exchange(主题交换机)
交换机
核心作用:分发路由消息、中专
队列
:容器存放多个不同消息 遵循先进先出的原则
消息
:传递的参数
路由键
:交换机根据这样的路由键的值,发送不同的队列中 匹配过程
扇型交换机
主要的特征:
只要队列绑定同一个交换机,生产者将消息投递到交换机中,交换机会将消息发送给所有绑定
的队列进行存放消息。
直连交换机:
三、直连交换机类型设计原理
Direct exchange(直连交换机
):
根据生产者投递不同的路由键
,在交换机发送到
队列实现匹配
路由键
四、通过代码形式演示直连交换机
可以绑定多个 Rounting key:
五、主题交换机类型实现模糊匹配
当交换机类型为topic类型时,根据队列绑定的路由建模糊
转发到具体的队列中存放。
#号
表示支持匹配多个词
;
*号
表示只能匹配一个词
六、SpringBoot整合Rabbitmq配置
Topic 主题交换
机:
根据路邮键的key实现模糊匹配
到队列存放。
@Component
public class RabbitMQConfig {
/**
* springboot项目中整合队列
*/
/**
* 定义交换机
*/
private String EXCHANGE_SPRINGBOOT_NAME = "mayikt_springboot_exchange";
/**
* 短信队列
*/
private String FANOUT_QUEUE_SMS = "mayikt_fanout_sms_queue";
/**
* 邮件队列
*/
private String FANOUT_QUEUE_EMAIL = "mayikt_fanout_email_queue";
/**
* 声明的sms队列
*
* @return
*/
@Bean
public Queue smsQueue() {
return new Queue(FANOUT_QUEUE_SMS);
}
/**
* 声明的email队列
*
* @return
*/
@Bean
public Queue emailQueue() {
return new Queue(FANOUT_QUEUE_EMAIL);
}
/**
* 声明我们的交换机
*
* @return
*/
@Bean
public FanoutExchange fanoutExchange() {
return new FanoutExchange(EXCHANGE_SPRINGBOOT_NAME);
}
/**
* 短信队列绑定我们的交换机-
*
* @param smsQueue
* @param fanoutExchange
* @return
*/
@Bean
public Binding smsBindingExchange(Queue smsQueue, FanoutExchange fanoutExchange) {
return BindingBuilder.bind(smsQueue).to(fanoutExchange);
}
/**
* 邮件队列绑定我们的交换机-
*
* @param emailQueue
* @param fanoutExchange
* @return
*/
@Bean
public Binding emailBindingExchange(Queue emailQueue, FanoutExchange fanoutExchange) {
return BindingBuilder.bind(emailQueue).to(fanoutExchange);
}
// bean id
}
七、使用SpringBoot自动创建队列和交换机
@RestController
public class FanoutProducer {
@Autowired
private AmqpTemplate amqpTemplate;
/**
* 短信队列
*/
private String FANOUT_QUEUE_SMS = "mayikt_fanout_sms_queue";
@RequestMapping("/sendMsg")
public String sendMsg() {
// 投递消息 客户端不会立马知道消费是否被消费,但是能够确认知道我们是否投递到消息中间件
amqpTemplate.convertAndSend(FANOUT_QUEUE_SMS, "mayikt");
/* 根据消息全局id主动查询
*/
return "success";
}
}
@Component
@RabbitListener(queues = "mayikt_fanout_sms_queue")
public class FanoutEmailConsumer {
/**
* 监听队列回调的方法
*
* @param msg
*/
@RabbitHandler
public void process(String msg) {
System.out.println("短信消费者消息msg:" + msg);
}
}
会自动创建队列
八、实现路由分发多个不同队列