@TOC
1/基本概念
1、消息队列MQ
是一个搭建号的服务器,可以和大部分框架进行整合
应用场景
消息中间件
消息中间件的组成
消息被处理的过程称为消费
queue是点对点的关系,只能被一个consumer处理,不能被反复处理
topic,只要订阅了就可以处理
消息中间件的优势
示例:
参与抢购——消息中间件进行验证,验证成功——通知你成功参与抢购——消息中间件处理(队列慢慢处理)——然后通知是否抢购成功
涌入的多,处理就慢,涌入的少,处理的快
请求——验证(15ms,此处需要严谨)——写入SQL(50ms)——发短信通知(50ms)——发邮件响应(50ms)——总时间165ms,这种响应时间是硬性的,可以写到3个队列里面
Rabbit MQ
AMQP协议相关概念
常用的交换器
点对点
所有的消费者都要处理
代码实操
连接宿主机
打开虚拟机
打开服务器
配置文件
将mq的文件夹移到虚拟机
15672是界面访问端口,5672交流和使用的端口
代码
创建项目
依赖
<!-- rabbitmq依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
配置
server:
port: 8080
spring:
rabbitmq:
host: 192.168.29.128 #主机地址
port: 5672 #数据处理的端口
username: guest
password: guest
Product.java生成消息
@Component
public class Producer {
@Autowired
private RabbitTemplate rabbitTemplate;
/** 发布消息 */
public void produce(int code){
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
//获取消息内容
String message = sdf.format(new Date()) + "-" + code;
System.out.println("发布消息:" + message);
rabbitTemplate.convertAndSend("test_rabbit", message);
}
}
消费消息,不需要任何的调用
@Component
public class Consumer {
@RabbitHandler
@RabbitListener(queuesToDeclare = @Queue("test_rabbit")) //监听这个队列
public void consume(String message){
System.out.println("消费消息:" + message);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@RestController
public class TestController {
@Autowired
private Producer producer;
@PostMapping("send")
public Object sendMessage(){
for (int i = 1; i <= 200; i++){
producer.produce(i);
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return "已发布200个消息";
}
}