目录
1. RabbitMQ
概述
1.1. RabbitMQ
消息流动过程
RabbitMQ
的一个消息从推送到接收的流程
黄色的圈圈就是我们的消息推送服务,将消息推送到中间方框里面也就是 RabbitMQ
的服务器,然后经过服务器里面的交换机、队列等各种关系(后面会详细讲)将数据处理入列后,最终右边的蓝色圈圈消费者获取对应监听的消息
1.2. 交换机的模式
常用的交换机有以下 3
种,因为消费者是从队列获取信息的,队列是绑定交换机的(一般),所以对应的消息推送,接收模式也会有以下几种
DirectExchange
:精确匹配RoutingKey
,将消息发送到绑定到Exchange
交换机的指定Queue
队列中FanoutExchange
:忽略RoutingKey
,将消息发送到绑定到Exchange
交换机的所有Queue
队列中TopicExchange
:模糊匹配RoutingKey
,将消息发送到绑定到Exchange
交换机的指定Queue
队列中
1.2.1. Topic
匹配订阅模式
*
:表示一个单词 (必须出现的)#
:表示任意数量(零个或多个)单词
通配的绑定键是跟队列进行绑定的。例如,队列 Q1
绑定键为 *.TT.*
,队列 Q2
绑定键为 TT.#
- 如果一条消息携带的路由键为
A.TT.B
,那么队列Q1
将会收到; - 如果一条消息携带的路由键为
TT.AA.BB
,那么队列Q2
将会收到
当一个队列的绑定键为 #
的时候,这个队列将会无视消息的路由键,接收所有的消息。当 *
和 #
这两个特殊字符都未在绑定键中出现的时候,此时主题交换机就拥有的直连交换机的行为
2. RabbitMQ
与 SpringBoot
整合
SpringBoot
版本:2.0.6.RELEASE
Rabbitmq
版本:3.8.3
我们需要创建 2
个 SpringBoot
项目,一个 rabbitmq-provider
,一个rabbitmq-consumer
。首先搭建 rabbitmq-provider
2.1. DirectExchange
路由模式
2.1.1. 消息 provider
提供者端
2.1.1.1. Maven
主要依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2.1.1.2. 配置文件
server.port=8080
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
2.1.1.3. 配置类
@Configuration
public class DirectRabbitConfig {
@Bean
public Queue DirectQueue() {
/*durable:是否持久化,默认是false,持久化队列:会被存储在磁盘上,当消息代理重启时仍然存在*/
/*exclusive:默认也是false,只能被当前创建的连接使用,而且当连接关闭后队列即被删除*/
/*autoDelete:是否自动删除,当没有生产者或者消费者使用此队列,该队列会自动删除*/
/*一般设置一下队列的持久化就好,其余两个就是默认false*/
return new Queue("DirectQueue", true);
}
@Bean
public DirectExchange directExchange() {
return new DirectExchange("directExchange", true, false);
}
// 将队列和交换机绑定, 并设置用于匹配键:DirectRouting
@Bean
public Binding binding() {
return BindingBuilder.bind(DirectQueue()).to(directExchange()).with("DirectRouting");
}
}
2.1.1.4. 发送消息接口
@Controller
public class SendMessageController {
@Autowired
private RabbitTemplate rabbitTemplate;
@GetMapping("/sendDirectMessage")
@ResponseBody
public String sendDirectMessage() {
String messageId = String.valueOf(UUID.randomUUID());
String messageData = "test message, hello!";
String createTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
Map<String, Object> map = new HashMap<>();
map.put("messageId", messageId);
map.put("messageData", messageData);
map.put("createTime", createTime);
// 将消息携带绑定键值 DirectRouting 发送到交换机 directExchange 上
rabbitTemplate.convertAndSend("directExchange", "DirectRouting", map);
return "消息已发送至rabbitmq server";
}
}
2.1.1.4. 测试
启动 rabbitmq
服务,再启动项目 rabbitmq-provider
,调用该 http://localhost:8080/sendDirectMessage
接口,再打开 rabbitmq
管理页面 http://localhost:15672/#/