• RabbitMQ学习总结-基础篇


    1..RabbitMQ 本身是一个消息中间件,在服务应用中,可解决高性能,高并发,高应用的问题,极大程度上解决了应用的性能问题。

    2.MQ的使用分为生产者和消费者,生产者生产消息,消费者去消费消息。

    3.MQ的主要组成部分,交换机/队列/路由键,生产者生产消息可以直接到队列,然后消费者消费,也可以通过交换机再到队列。在真正的生产应用中,基本都是通过交换机再到队列,根据路由键准确的到达消费者。

    4.交换机/队列/路由键是独立的三部分,是需要互相绑定的,交换机需要绑定队列,队列绑定路由键,如图:

    5.在实际应用中,不可能一个MQ服务只支持一个队列或者应用,但是又要实现一个MQ应用可以支持多个服务消息,这样,就要使用不同的虚拟主机,实现数据隔离,配置文件中配置的虚拟主机实例,决定了向哪里发消息(如:virtual-host: /hmall),配置如下:

    1. logging:
    2. pattern:
    3. dateformat: MM-dd HH:mm:ss:SSS
    4. level:
    5. com.itheima: debug
    6. spring:
    7. rabbitmq:
    8. host: 192.168.***.****
    9. port: 5672
    10. virtual-host: /hmall
    11. username: hmall
    12. password: 123
    13. connection-timeout: 1s #超时时间
    14. template:
    15. retry:
    16. enabled: true #开启重试机制
    17. initial-interval: 1000ms #失败后初始等待时间
    18. multiplier: 1 #失败后下次等待时常=1*1000ms
    19. max-attempts: 3 #最大等待次数
    20. publisher-confirm-type: correlated #生产者确认模式,异步回执
    21. publisher-returns: true #开启生产者return机制

    6.MQ发送消息的方式有四种,但是实际应用的时候大部分只用了三种:

    Fanout:广播,将消息交给所有绑定到交换机的队列。我们最早在控制台使用的正是Fanout交换机

    Direct:订阅,基于RoutingKey(路由key)发送给订阅了消息的队列

    Topic:通配符订阅,与Direct类似,只不过RoutingKey可以使用通配符

    • #:匹配一个或多个词

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

    Headers:头匹配,基于MQ的消息头匹配,用的较少。

    7.MQ也有自己的Template,mq的消息发送基于RabbitTemplate,使用方法如下:

      rabbitTemplate.convertAndSend("交换机", "路由键", msg);

    8.基于注解,注册交换机/队列/路由键,省去在控制台添加的麻烦,代码如下:

    1. @RabbitListener(bindings = @QueueBinding(
    2. value = @Queue(name = "direct.queue1"),
    3. exchange = @Exchange(name = "hmall.direct", type = ExchangeTypes.DIRECT),
    4. key = {"red", "blue"}
    5. ))

    9.MQ发送的消息,要经过转换器转换下,不然会出现人识别不了的乱码,所以要配置一个JSON的转换器,

    依赖如下:

    注:如果项目中引入了spring-boot-starter-web依赖,则无需再次引入Jackson依赖

    1. <dependency>
    2. <groupId>com.fasterxml.jackson.dataformatgroupId>
    3. <artifactId>jackson-dataformat-xmlartifactId>
    4. <version>2.9.10version>
    5. dependency>

    代码如下:

    在配置类中直接注入这个bean就可以,或者自己定义一个配置类,服务启动就加载

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

  • 相关阅读:
    SSM+好乐买超市管理系统 毕业设计-附源码111743
    C-内存函数(大量图解,函数实现)
    数据隐私保护与合规性:现代企业的数据安全策略
    springboot测试类,注解
    1156 Sexy Primes – PAT甲级真题
    ffmpeg+nginx-rtmp转发视频流
    Spring(1):BeanDefinitionRegistry
    二进制中 1 的个数+确定一个数字是否为 2 的幂+最大化交易利润
    maven工程打包引入本地jar包
    Java 图书管理系统
  • 原文地址:https://blog.csdn.net/qq_28339335/article/details/136674254