• 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();
        }
    }
    

      

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

    望你回来添加,这些数据

  • 相关阅读:
    git删除远程tag
    date的getTime问题
    EasyExcel读取excel文件反射成实体后全为NULL
    springboot回滚部分异常
    Java8 LocalDate、Date、LocalDateTime、时间戳的转换
    mysql未查到行,返回一条默认结果
    Maven No archetype found in remote catalog. Defaulting to internal catalog.
    HashMap相关资料
    HibernateHql
    用户名登录
  • 原文地址:https://www.cnblogs.com/helloqiufei/p/11536473.html
Copyright © 2020-2023  润新知