RabbitMq 深入了解

                                                                                    积少成多 ----  仅以此致敬和我一样在慢慢前进的人儿

问题一:什么是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();
    }
}

  

目前因为只是了解的比较浅,所以只能记录这些简单的东西,待后面深入了解之后,

望你回来添加,这些数据

原文地址:https://www.cnblogs.com/helloqiufei/p/11536473.html