• MQ基础(RabbitMQ)


    通信

    同步通信:就相当于打电话,双方交互是实时的。同一时刻,只能与一人交互。

    异步通信:就相当于发短信,双方交互不是实时的。不需要立刻回应对方,可以多线程操作,跟不同人同时聊天。

    RabbitMQ

    过程

    几个基础概念

    publisher:生产者,发送消息的一方

    consumer:消费者消费消息的一方

    queue:队列,存储消息。生产者投递的消息会暂时存储在消息队列中,等待消费者消费。

    exchange:交换机,负责消息路由。生产者发送的消息由交换机决定投递到哪个队列。

    virtual host:虚拟主机,起到数据隔离的作用。每个虚拟主机相互独立,有各自的交换机,队列。

    RabbitMQ框架

    某个虚拟主机,生产者发送消息到交换机,再由交换机发送消息到队列,队列把消息推送给消费者。

    SpringAMQP

    依赖

    org.springframework.boot spring-boot-starter-amqp

    配置说明

    spring:
      rabbitmq:
        host: 192.168.32.130 # 你的虚拟机IP
        port: 5672 # 端口
        virtual-host: /hm # 虚拟主机
        username: lxs # 用户名
        password: 123456 # 密码
        listener:
          simple:
            prefetch: 1 # 每次只能获取一条消息,处理完成才能获取下一个消息

    交换机说明

    Fanout

    Fanout交换机(广播)会将消息路由到每个绑定队列中。

    Direct

    Direct交换机不再把消息交给每一个绑定的队列,而是根据消息的Routing Key进行判断,只有队列的Routingkey与消息的 Routing key完全一致,才会接收到消息

    Topic

    Topic类型的ExchangeDirect相比,都是可以根据RoutingKey把消息路由到不同的队列。

    只不过Topic类型Exchange可以让队列在绑定BindingKey 的时候使用通配符!

    通配符规则
    • #:匹配一个或多个词

    • *:匹配不多不少恰好1个

    举例:

    • item.#:能够匹配item.spu.insert 或者 item.spu

    • item.*:只能匹配item.spu

    消息转换器

    默认情况下Spring采用的序列化方式是JDK序列化。

    配置JSON转换器

    依赖<dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> <version>2.9.10</version> </dependency>

      配置类

    @Bean
    public MessageConverter messageConverter(){
        // 1.定义消息转换器
        Jackson2JsonMessageConverter jackson2JsonMessageConverter = new Jackson2JsonMessageConverter();
        // 2.配置自动创建消息id,用于识别不同消息,也可以在业务中基于ID判断是否是重复消息
        jackson2JsonMessageConverter.setCreateMessageIds(true);
        return jackson2JsonMessageConverter;
    }

    例子

    @RabbitListener(
            bindings = @QueueBinding(
                    value = @Queue(name = "topic.queue2"),
                    exchange = @Exchange(name = "hm.topic", type = ExchangeTypes.TOPIC),
                    key = "ch.*"
            )
    )
    public void TopicQueueC(String a) {
        System.out.println("topic.queue2 ch.*" + a);
    }

  • 相关阅读:
    公司销售个人号如何管理?
    MySQL高级(纯笔记,未整理)
    驱动开发:内核枚举ShadowSSDT基址
    MySQL启动后反复重新启动故障
    【云原生-k8s篇】管理容器的顶级 Kubernetes工具有哪些?
    深入探究HTML表单与JavaScript的关系
    VSCODE配置C和C++
    revit\navisworks各种安装问题
    贪心算法-点灯问题
    实践自定义弹框列表数据 slot 操作数据
  • 原文地址:https://blog.csdn.net/qq_52524736/article/details/139402037