积少成多 ---- 仅以此致敬和我一样在慢慢前进的人儿
问题一:什么是RabbitMq
下面就是些个人的感受,
rabbitmq 就是一个遵循AMQP协议(这个是啥不清楚) 的消息队列的实现,用于服务器和服务器之间的连接,
producer可以发送消息到消息队列里面,customer 可以消费消息队列
两者之间的方式有很多, 如常见的点对点(1V1)(专业术语:direct), 点对多(1V多)(专业术语: fanmout)
转化为大白话: A发送一条消息,这个消息只有B能接受到,这就是点对点
A发送一条消息, 这个消息B,C,D都可以接收到, 这个就是点对多
那么问题来了: 为什么要使用rabbitMq (使用场景是什么)
异步处理、应用解耦、流量削峰等
https://www.cnblogs.com/zhao-yi/p/9299126.html
在springBoot 中如何使用呢?
我自己使用的docker 运行 rabbitmq的镜像来做的,所以使用rabbitmq服务器的具体安装不太清楚
在springBoot 中主要步骤如下:
1、 引入依赖
<!-- 引入rabbitmq 消息中间件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2、 配置rabbitmq的连接(rabbit 本身就是一个服务器,它的连接方式就像jdbc连接数据一般)
# 配置rabbitmq的(可以自己查看rabbitProperties 去查看需要配置的项,以及默认的配置项)
sring:
rabbitmq:
host: 192.168.3.48
port: 5672
virtual-host: /
username: guest
password: guest
3、发布消息和接受消息案例
# 发布消息测试
@Test public void test(){ //像极了之前的template 工具,就是对rabbitmq的操作集合在一起了 System.out.println("HELLO"); // 下面的send 里面需要 参数message 但是查询之后,这个message 有点麻烦是一个类,所以不建议使用这个 // rabbitTemplate.send("qf.direct","qf","记住你是直接连接的"); Map<String, Object> map = new HashMap<>(); map.put("first", "你好"); map.put("second", "大家好"); rabbitTemplate.convertAndSend("exchange.direct", "qf",map); System.out.println("发送成功"); }
# 消费消息测试
@Test
public void receive(){
// 指定获取某个消息队列里面的消息
Object qf = rabbitTemplate.receiveAndConvert("qf");
System.out.println(qf.getClass());
System.out.println(qf);
System.out.println("成功获取");
}
4、 使用@RabbitListener 注解(这部分的详细的使用逻辑以及原理一窍不通)
使用@RabbitListener注解需要开启rabbitmq注解
@EnableRabbit
@EnableCaching
@MapperScan("com.qf.springboot01.dao")
@SpringBootApplication
public class Springboot01Application {
public static void main(String[] args) {
SpringApplication.run(Springboot01Application.class, args);
}
}
使用案列如下:
@RabbitListener(queues = "qf") public void receive(Object person){ if(person == null){ System.out.println("person里面是空的"); } System.out.println(); System.out.println("接受人" + person); System.out.println(person.toString()); } }
该注解 queues 参数用于指定监听的队列,可以监听多个队列
该注解标注的方法的参数,用于匹配队列里面的消息,如果里面是相同类型的数据则直接进行数据封装获取,如果不一样的
则不进行封装,但是也会消费一条消息。
白话就是:我取一条消息,参数跟我对应那就给你,如果不相同那就不给你了,但是消息我也取出来。
5、 注意事项:
在引入依赖的时候,其中RabbitAutoConfiguration 这个类 帮我们自动配置了很多东西,其中将消息的body存储到队列中的序列化的方式也配置了
但是默认的序列化是序列化为byte数组的方式存储到队列中,造成阅读障碍。
所以自己配置了他的MessageConverter ,如下:
@Configuration public class MyAMQPConfig { @Bean public MessageConverter messageConverter(){ return new Jackson2JsonMessageConverter(); } }
目前因为只是了解的比较浅,所以只能记录这些简单的东西,待后面深入了解之后,
望你回来添加,这些数据