1.Fanout(广播模式)
1.基本介绍

2.需求分析

3.具体实现
1.编写配置类 RabbitMQConfig.java
private static final String EXCHANGE = "exchange";
private static final String QUEUE1 = "queue1";
private static final String QUEUE2 = "queue2";
@Bean
public Queue queue1() {
return new Queue(QUEUE1, true);
}
@Bean
public Queue queue2() {
return new Queue(QUEUE2, true);
}
@Bean
public FanoutExchange exchange() {
return new FanoutExchange(EXCHANGE);
}
@Bean
public Binding binding1() {
return BindingBuilder.bind(queue1()).to(exchange());
}
@Bean
public Binding binding2() {
return BindingBuilder.bind(queue2()).to(exchange());
}
2.编写生产者,发送消息到交换机 MQSender.java
public void sendExchange(Object message) {
log.info("发送消息到交换机: " + message);
rabbitTemplate.convertAndSend("exchange", "", message);
}
3.编写消费者,接受消息 MQReceiver.java
@RabbitListener(queues = "queue1")
public void receive1(Object message) {
log.info("queue1接收消息: " + message);
}
@RabbitListener(queues = "queue2")
public void receive2(Object message) {
log.info("queue2接收消息: " + message);
}
4.控制层调用方法,发送信息到交换机
@RequestMapping("/mq/exchange")
@ResponseBody
public void mqExchange() {
mqSender.sendExchange("hello rabbitmq exchange");
}
4.启动测试
1.访问查看IDEA控制台输出
1.访问 http://localhost:9092/seckill/mq/exchange

2.查看控制台输出,两个队列同时接受到了消息

2.访问RabbitMQ控制台 http://ip:15672
1.查看交换机是否绑定了两个队列


2.再查看Queues,新增了两个队列

2.Direct(路由模式)
1.基本介绍

2.需求分析

3.具体实现
1.配置类 RabbitMQConfig.java
private static final String DIRECT_EXCHANGE = "directExchange";
private static final String DIRECT_QUEUE1 = "directQueue1";
private static final String DIRECT_QUEUE2 = "directQueue2";
public static final String RED = "red";
public static final String GREEN = "green";
@Bean
public Queue directQueue1() {
return new Queue(DIRECT_QUEUE1, true);
}
@Bean
public Queue directQueue2() {
return new Queue(DIRECT_QUEUE2, true);
}
@Bean
public DirectExchange directExchange() {
return new DirectExchange(DIRECT_EXCHANGE);
}
@Bean
public Binding directBinding1() {
return BindingBuilder.bind(directQueue1()).to(directExchange()).with(RED);
}
@Bean
public Binding directBinding2() {
return BindingBuilder.bind(directQueue2()).to(directExchange()).with(GREEN);
}
2.编写生产者,发送消息到交换机并指定路由 MQSender.java
public void sendDirect(Object message, String routingKey) {
log.info("发送消息到Direct交换机: " + message);
rabbitTemplate.convertAndSend("directExchange", routingKey, message);
}
3.编写消费者,接受消息 MQReceiver.java
@RabbitListener(queues = "directQueue1")
public void receiveDirect(Object message) {
log.info("directQueue1接收消息: " + message);
}
@RabbitListener(queues = "directQueue2")
public void receiveDirect2(Object message) {
log.info("directQueue2接收消息: " + message);
}
4.控制层调用方法,发送信息到交换机
@RequestMapping("/mq/direct/{routingKey}")
@ResponseBody
public void mqDirect(@PathVariable String routingKey) {
mqSender.sendDirect("hello rabbitmq direct", routingKey);
}
4.启动测试
1.访问查看IDEA控制台输出
1.访问 http://localhost:9092/seckill/mq/direct/green

2.访问 http://localhost:9092/seckill/mq/direct/red

2.访问RabbitMQ控制台 http://140.143.164.206:15672
1.交换机绑定了两个队列


2.再查看Queues,新增了两个队列

3.Topic(主题模式)
1.基本介绍
1.介绍

2.关于匹配模式的说明
- 星号:可以匹配一个单词
- 井号:可以匹配零个或多个单词
2.需求分析

3.具体实现
1.配置类 RabbitMQConfig.java
private static final String TOPIC_EXCHANGE = "topicExchange";
private static final String TOPIC_QUEUE1 = "topicQueue1";
private static final String TOPIC_QUEUE2 = "topicQueue2";
public static final String ROUTING_KEY1 = "*.orange.*";
public static final String ROUTING_KEY2 = "*.*.rabbit";
public static final String ROUTING_KEY3 = "lazy.#";
@Bean
public Queue topicQueue1() {
return new Queue(TOPIC_QUEUE1, true);
}
@Bean
public Queue topicQueue2() {
return new Queue(TOPIC_QUEUE2, true);
}
@Bean
public TopicExchange topicExchange() {
return new TopicExchange(TOPIC_EXCHANGE);
}
@Bean
public Binding topicBinding1() {
return BindingBuilder.bind(topicQueue1()).to(topicExchange()).with(ROUTING_KEY1);
}
@Bean
public Binding topicBinding2() {
return BindingBuilder.bind(topicQueue2()).to(topicExchange()).with(ROUTING_KEY2);
}
@Bean
public Binding topicBinding3() {
return BindingBuilder.bind(topicQueue2()).to(topicExchange()).with(ROUTING_KEY3);
}
2.编写生产者,发送消息到交换机并指定路由 MQSender.java
public void sendTopic(Object message, String routingKey) {
log.info("发送消息到Topic交换机: " + message);
rabbitTemplate.convertAndSend("topicExchange", routingKey, message);
}
3.编写消费者,接受消息 MQReceiver.java
@RabbitListener(queues = "topicQueue1")
public void receiveTopic1(Object message) {
log.info("topicQueue1接收消息: " + message);
}
@RabbitListener(queues = "topicQueue2")
public void receiveTopic2(Object message) {
log.info("topicQueue2接收消息: " + message);
}
4.控制层调用方法,发送信息到交换机
@RequestMapping("/mq/topic/{routingKey}")
@ResponseBody
public void mqTopic(@PathVariable String routingKey) {
mqSender.sendTopic("hello rabbitmq topic", routingKey);
}
4.启动测试
1.示意图

2.访问查看IDEA控制台输出
1.访问 http://localhost:9092/seckill/mq/topic/one.orange.one 匹配Q1

2.访问 http://localhost:9092/seckill/mq/topic/one.one.rabbit 匹配Q2

3.访问 http://localhost:9092/seckill/mq/topic/lazy.orange.one 匹配Q1和Q2

4.访问 http://localhost:9092/seckill/mq/topic/lazy.any.any.any.any 匹配Q2

4.Headers(头路由模式,使用较少)
1.基本介绍

2.示意图

3.需求分析

4.具体实现
1.配置类 RabbitMQConfig.java
private static final String HEADERS_EXCHANGE = "headersExchange";
private static final String HEADERS_QUEUE1 = "headersQueue1";
private static final String HEADERS_QUEUE2 = "headersQueue2";
@Bean
public Queue headersQueue1() {
return new Queue(HEADERS_QUEUE1, true);
}
@Bean
public Queue headersQueue2() {
return new Queue(HEADERS_QUEUE2, true);
}
@Bean
public HeadersExchange headersExchange() {
return new HeadersExchange(HEADERS_EXCHANGE);
}
@Bean
public Binding headersBinding1() {
Map<String, Object> map = new HashMap<>();
map.put("key1", "value1");
map.put("key2", "value2");
return BindingBuilder.bind(headersQueue1()).to(headersExchange()).whereAny(map).match();
}
@Bean
public Binding headersBinding2() {
Map<String, Object> map = new HashMap<>();
map.put("key3", "value3");
map.put("key4", "value4");
return BindingBuilder.bind(headersQueue2()).to(headersExchange()).whereAll(map).match();
}
2.编写生产者,发送消息到交换机并指定路由 MQSender.java
public void sendHeaders(Object message) {
log.info("发送消息到Headers交换机: " + message);
rabbitTemplate.convertAndSend("headersExchange", "", message, message1 -> {
message1.getMessageProperties().getHeaders().put("key1", "value1");
return message1;
});
}
public void sendHeaders2(Object message) {
log.info("发送消息到Headers交换机: " + message);
rabbitTemplate.convertAndSend("headersExchange", "", message, message1 -> {
message1.getMessageProperties().getHeaders().put("key3", "value3");
message1.getMessageProperties().getHeaders().put("key4", "value4");
return message1;
});
}
3.编写消费者,接受消息 MQReceiver.java
@RabbitListener(queues = "headersQueue1")
public void receiveHeaders1(Object message) {
log.info("headersQueue1接收消息: " + message);
}
@RabbitListener(queues = "headersQueue2")
public void receiveHeaders2(Object message) {
log.info("headersQueue2接收消息: " + message);
}
4.控制层调用方法,发送信息到交换机
@RequestMapping("/mq/headers")
@ResponseBody
public void mqHeaders() {
mqSender.sendHeaders("hello rabbitmq headers");
}
@RequestMapping("/mq/headers2")
@ResponseBody
public void mqHeaders2() {
mqSender.sendHeaders2("hello rabbitmq headers2");
}
5.启动测试
1.访问查看IDEA控制台输出
1.访问 http://localhost:9092/seckill/mq/headers 匹配队列一

2.访问 http://localhost:9092/seckill/mq/headers2 匹配队列二

5.RabbitMQ使用模式总结
1.整体架构图

2.通用使用方式
1.编写RabbitMQ的配置类
- 创建交换机和队列
- 将队列分别与交换机按照具体标识绑定
2.编写消息发送者
3.编写消息接受者
4.编写控制层