【系统开发】尚硅谷 - 谷粒商城项目笔记(七):消息队列

news2024/12/25 22:50:52

文章目录

  • 消息队列
    • 概述
    • 两大种类
    • RabbitMQ
    • 安装及基操
      • Docker中安装
      • 添加用户
      • 创建Virtual Hosts
      • 设置权限
      • 添加交换机
      • 创建队列
      • 交换机绑定队列
    • 五种消息模型
    • SpringBoot整合MQ
      • 引入依赖
      • properties配置
      • 开启RabbitMQ
    • API使用
      • 创建交换机
      • 创建队列
      • 交换机绑定队列
      • 发送消息
      • 接收消息
    • 消息确认机制
    • 延时队列


消息队列

概述

image-20220210152321702

image-20220210152336379

image-20220210153053885

两大种类

image-20220130193309249

RabbitMQ

在这里插入图片描述

image-20220130194025240

安装及基操

Docker中安装

image-20220210161046651

下载镜像:docker pull rabbitmq:management

创建实例并启动:

docker run -d --name rabbitmq --publish 5671:5671 \
--publish 5672:5672 --publish 4369:4369 --publish 25672:25672 --publish 15671:15671 --publish 15672:15672 \
rabbitmq:management
  • 4369 – erlang发现口
  • 5672 --client端通信口
  • 15672 – 管理界面ui端口
  • 25672 – server间内部通信口

在web浏览器中输入地址:http://服务器ip:15672/

输入默认账号: guest : guest

image-20220210162234117

overview:概览

connections:无论生产者还是消费者,都需要与RabbitMQ建立连接后才可以完成消息的生产和消费,在这里可以查看连接情况

channels:通道,建立连接后,会形成通道,消息的投递获取依赖通道。

Exchanges:交换机,用来实现消息的路由

Queues:队列,即消息队列,消息存放在队列中,等待消费,消费后被移除队列。

端口

5672: rabbitMq的编程语言客户端连接端口

15672:rabbitMq管理界面端口

25672:rabbitMq集群的端口

添加用户

如果不使用guest,我们也可以自己创建一个用户:

img

1、 超级管理员(administrator)

可登陆管理控制台,可查看所有的信息,并且可以对用户,策略(policy)进行操作。

2、 监控者(monitoring)

可登陆管理控制台,同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)

3、 策略制定者(policymaker)

可登陆管理控制台, 同时可以对policy进行管理。但无法查看节点的相关信息(上图红框标识的部分)。

4、 普通管理者(management)

仅可登陆管理控制台,无法看到节点信息,也无法对策略进行管理。

5、 其他

无法登陆管理控制台,通常就是普通的生产者和消费者。

创建Virtual Hosts

虚拟主机:类似于mysql中的database。他们都是以“/”开头

img

设置权限

img

img

img

添加交换机

image-20220210164256701

image-20220210164319979

创建队列

image-20220210164502957

交换机绑定队列

image-20220210164559367

image-20220210164724392

绑定成功

image-20220210164744460

五种消息模型

RabbitMQ提供了6种消息模型,但是第6种其实是RPC,并不是MQ,因此不予学习。那么也就剩下5种。

但是其实3、4、5这三种都属于订阅模型,只不过进行路由的方式不同。

img

  1. 点对点
  2. 多人监听
  3. 主题模式
  4. 字符串精确匹配传输消息的广播
  5. 字符串支持通配符匹配传输消息的广播

SpringBoot整合MQ

引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

properties配置

# ip
spring.rabbitmq.host=192.168.11.130
# 端口
spring.rabbitmq.port=5672
# virtualHost
spring.rabbitmq.virtual-host=/
# 开启发送端消息抵达Broker确认
spring.rabbitmq.publisher-confirms=true
# 开启发送端消息抵达Queue确认
spring.rabbitmq.publisher-returns=true
# 只要消息抵达Queue,就会异步发送优先回调returnfirm
spring.rabbitmq.template.mandatory=true
# 手动ack消息,不使用默认的消费端确认
spring.rabbitmq.listener.simple.acknowledge-mode=manual

开启RabbitMQ

// 开启RabbitMQ支持
@EnableRabbit
@SpringBootApplication
public class Application {
	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}
}

API使用

创建交换机

image-20220210171016097

创建队列

image-20220210171256354

交换机绑定队列

image-20220210171556719

发送消息

image-20220210171959425

用JSON发送含有对象的消息,需要自定义配置类

@Configuration
public class MyRabbitConfig {
    @Bean
    public MessageConverter messageConverter() {
        return new Jackson2JsonMessageConverter();
    }
}

image-20220210172435362

接收消息

image-20220210173227353

image-20220210174110149

消息确认机制

image-20220210174326073

image-20220210174702392

image-20220210191109546

image-20220210191134176

RabbitMQ配置类

@Configuration
public class MyRabbitConfig {

    private RabbitTemplate rabbitTemplate;

    @Primary
    @Bean
    public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
        RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
        this.rabbitTemplate = rabbitTemplate;
        rabbitTemplate.setMessageConverter(messageConverter());
        initRabbitTemplate();
        return rabbitTemplate;
    }

    @Bean
    public MessageConverter messageConverter() {
        return new Jackson2JsonMessageConverter();
    }

    /**
     * 定制RabbitTemplate
     * 1、服务收到消息就会回调
     *      1、spring.rabbitmq.publisher-confirms: true
     *      2、设置确认回调
     * 2、消息正确抵达队列就会进行回调
     *      1、spring.rabbitmq.publisher-returns: true
     *         spring.rabbitmq.template.mandatory: true
     *      2、设置确认回调ReturnCallback
     *
     * 3、消费端确认(保证每个消息都被正确消费,此时才可以broker删除这个消息)
     *
     */
    // @PostConstruct  //MyRabbitConfig对象创建完成以后,执行这个方法
    public void initRabbitTemplate() {

        /**
         * 1、只要消息抵达Broker就ack=true
         * correlationData:当前消息的唯一关联数据(这个是消息的唯一id)
         * ack:消息是否成功收到
         * cause:失败的原因
         */
        //设置确认回调
        rabbitTemplate.setConfirmCallback((correlationData,ack,cause) -> {
            System.out.println("confirm...correlationData["+correlationData+"]==>ack:["+ack+"]==>cause:["+cause+"]");
        });


        /**
         * 只要消息没有投递给指定的队列,就触发这个失败回调
         * message:投递失败的消息详细信息
         * replyCode:回复的状态码
         * replyText:回复的文本内容
         * exchange:当时这个消息发给哪个交换机
         * routingKey:当时这个消息用哪个路邮键
         */
        rabbitTemplate.setReturnCallback((message,replyCode,replyText,exchange,routingKey) -> {
            System.out.println("Fail Message["+message+"]==>replyCode["+replyCode+"]" +
                    "==>replyText["+replyText+"]==>exchange["+exchange+"]==>routingKey["+routingKey+"]");
        });
    }
}

延时队列

相当于定时任务

image-20220302194504015

image-20220302194808124

image-20220302195209042

image-20220302200139566

@Configuration
@Slf4j
public class MyMqConfig {
    /* 容器中的Queue、Exchange、Binding 会自动创建(在RabbitMQ)不存在的情况下 */
	/* RabbitMq里面如果有,即使属性发生变化,也不会覆盖
    /*
     * @Description 延时消息队列-死信队列
     * @Author WSKH
     */
    @Bean
    public Queue orderDelayQueue() {
        /*
            Queue(String name,  队列名字
            boolean durable,  是否持久化
            boolean exclusive,  是否排他
            boolean autoDelete, 是否自动删除
            Map<String, Object> arguments) 属性
         */
        HashMap<String, Object> arguments = new HashMap<>();
        arguments.put("x-dead-letter-exchange", "order-event-exchange");
        arguments.put("x-dead-letter-routing-key", "order.release.order");
        // 消息过期时间 1分钟
        arguments.put("x-message-ttl", 60000);

        return new Queue(MqConstants.ORDER_DELAY_QUEUE, true, false, false, arguments);
    }

    /**
     * @Description 普通队列-延时队列死亡后,消息经过exchange送给普通队列,接收者负责删除订单
     * @Author WSKH
     */
    @Bean
    public Queue orderReleaseQueue() {
        return new Queue(MqConstants.ORDER_RELEASE_ORDER_QUEUE, true, false, false);
    }

   /**
    * @Description 创建order交换机
    * @Author WSKH
    */
    @Bean
    public Exchange orderEventExchange() {
        /*
         *   String name,
         *   boolean durable,
         *   boolean autoDelete,
         *   Map<String, Object> arguments
         * */
        return new TopicExchange(MqConstants.ORDER_EVENT_EXCHANGE, true, false);
    }

    /**
     * @Description 延时队列和order交换机的绑定(创建订单)
     * @Author WSKH
     */
    @Bean
    public Binding orderCreateBinding() {
        /*
         * String destination, 目的地(队列名或者交换机名字)
         * DestinationType destinationType, 目的地类型(Queue、Exhcange)
         * String exchange,
         * String routingKey,
         * Map<String, Object> arguments
         * */
        return new Binding(MqConstants.ORDER_DELAY_QUEUE,
                Binding.DestinationType.QUEUE,
                MqConstants.ORDER_EVENT_EXCHANGE,
                "order.create.order",
                null);
    }

    /**
     * @Description 普通队列和order交换机的绑定(负责释放到时间还没有支付的订单)
     * @Author WSKH
     */
    @Bean
    public Binding orderReleaseBinding() {
        return new Binding(MqConstants.ORDER_RELEASE_ORDER_QUEUE,
                Binding.DestinationType.QUEUE,
                MqConstants.ORDER_EVENT_EXCHANGE,
                "order.release.order",
                null);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/671548.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Notification API实战

什么是Notification&#xff1f; Notifications API 的接口 Notification 用于配置以向用户显示桌面通知。 这些通知的外观和功能因平台而异&#xff0c;但通常它们会提供一种异步向用户提供信息的方式。 前置要求 win10系统&#xff0c;且通知与操作中开启浏览器的通知权限 浏…

学习 SSL/TLS ,这一篇就够了

写在前面 如果某个网站受 SSL 证书保护&#xff0c;其相应的 URL 中会显示 HTTPS&#xff08;超文本传输安全协议&#xff09;。单击浏览器地址栏的小绿锁&#xff0c;即可查看证书中的详细信息。那么一本证书是如何诞生的&#xff1f;HTTPS 背后的 SSL/TLS 是如何在工作过程中…

❤ vue3 组件传值

❤ vue3 组件传值 [1] 子组件向父组件传值 使用emit使用方法 【子组件】 1、定义 emits,emits的定义是与component、setup等这些属性是同级 emits此时是作为数组&#xff0c;它也可以接收一个对象 2、使用 setup(props, { emit, refs }) {emit(addImg, 参数); }有时候需使…

Ubuntu20.04的cuda、cudnn、paddle安装完整过程

1、查看显卡驱动版本 显卡驱动安装看这篇&#xff1a; https://blog.csdn.net/Trisyp/article/details/131302061?spm1001.2014.3001.5501 然后输入命令nvidia-smi 查看显卡状态 2、CUDA 下载安装 直接手动在官网下载&#xff1a;CUDA Toolkit Archive | NVIDIA Developer…

【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(6月 21 日论文合集)

文章目录 一、检测相关(14篇)1.1 CrossKD: Cross-Head Knowledge Distillation for Dense Object Detection1.2 Depth and DOF Cues Make A Better Defocus Blur Detector1.3 Spatiotemporal Pyramidal CNN with Depth-Wise Separable Convolution for Eye Blinking Detection …

使用Kettle做数据迁移

1.Kettle简介 Kettle是一个颇受认可的开源ETL(Extract-Transform-Load 的缩写&#xff0c;即数据抽取、转换、装载的过程)工具&#xff0c;2006年被Pentaho收购&#xff0c;2015年又被Hitachi Vantara收购&#xff0c;正式命名为PDI。 PDI EE&#xff08;企业商用版&#xff0…

ASP.NET Core MVC 从入门到精通之Filter

随着技术的发展&#xff0c;ASP.NET Core MVC也推出了好长时间&#xff0c;经过不断的版本更新迭代&#xff0c;已经越来越完善&#xff0c;本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容&#xff0c;适用于初学者&#xff0c;在校毕业生&#xff0c…

【数据分享】1929-2022年全球站点的逐月降雪深度数据(Shp\Excel\12000个站点)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、能见度等指标&#xff0c;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 对于具体到监测站点的气象数据&#xff0c;之前我们分享过1929-2022年全球气象…

JavaScript排序sort()方法(解决null、undefined、0之间的排序(混乱)问题)

问题&#xff1a; 如果数组内某一对象为空值&#xff0c;排序是怎样的呢&#xff1f;(显然并不是按年龄顺序排序的&#xff0c;因为存在null和undefined) var arr[{"age":24,name:zs},{"age":0,name:ls},{"age":0,name:gr}&#xff0c;{"…

数据结构算法 -分而治之算法

引言 坤坤是一个养鸡场的员工&#xff0c;他非常热爱他的工作&#xff0c;并且总是努力提高他的专业技能。有一天&#xff0c;养鸡场接到了一项任务&#xff1a;在短时间内处理一批大量的鸡。 这批鸡数量非常大&#xff0c;比普通的数量要多得多&#xff0c;坤坤意识到他们需…

作业(Job)——OS

目录 1、批处理作业 2、交互式作业 小结&#xff1a;作业、进程、线程 作业概念 &#xff1a;用户要求计算机系统为其完成的计算任务集合。 作业步&#xff08;job step) &#xff1a;作业处理过程中一个相对独立的步骤 一般一个作业步可由一个进程完成某些作业步之间可以并…

2023世界人工智能大会-图技术高峰论坛重磅来袭!邀您共同参与!

2023年7月6-8日&#xff0c;一年一度的世界人工智能大会&#xff08;WAIC&#xff09;即将拉开帷幕。创邻科技作为大会的战略合作伙伴&#xff0c;将承办第三届图技术高峰论坛。 过去两届图技术论坛&#xff0c;分别以“大数据关联”和“AI应用”为关键词&#xff0c;邀请图技…

基于ChatGPT的端到端语音聊天机器人项目实战(一)

基于ChatGPT的端到端语音聊天机器人项目实战 ChatGPT API后台开发实战 本节主要是跟大家分享一个端到端的基于模型驱动的对话机器人,会有前端和后端,也会有一些具体模型的调用,读者需具有Python语言编程的基础,这是前置性的条件,有了这个基础,理论上讲本节所有的内容,…

Sui Move HackerHouse预热开启,9月大理见

9月3日&#xff0c;Sui Move 主题的 Antalpha HackerHouse 将在大理举办&#xff0c;为期 21 天&#xff0c;向所有 Web3 开发者发出 co-buidling & co-living 邀请。 本期 HackerHouse 由 Antalpha Labs 发起&#xff0c;Sui Foundation赞助&#xff0c;MoveFuns DAO、No…

魔视智能MOTOVIS入选世界经济论坛「2023年度技术先锋」

&#xffee;世界经济论坛&#xff08;World Economic Forum&#xff09;宣布从全球范围内选出了100家最有前途的技术先锋企业&#xff0c;这些企业致力于解决可持续性、气候变化和医疗保健等问题。 &#xffee;作为嵌入式人工智能自动驾驶的推动者&#xff0c;魔视智能MOTOVI…

项目管理,到底管什么?

在以前&#xff0c;项目管理职能单一且明确的时候&#xff0c;大家对项目管理的认知还比较统一&#xff1a;一个项目经理带领一个团队完成一个项目。 而在现在的环境下&#xff0c;尤其是互联网&#xff0c;项目经理的职能和定位以不同公司、不同老板、不同需要而参差不齐&…

制造业数字化转型解决方案

制造业数字化转型解决方案 数字化转型已成为制造业发展的必由之路&#xff0c;要提高生产制造水平&#xff0c;就需要提高对生产运营各环节数据的采集、处理和利用效率。当前的工业数据采集仍存在种种不足&#xff0c;现可以利用具有强大设备接入能力、通信协议转换能力、数据…

多线程(十):总结

本章用来处理一下之前遗漏的很多问题&#xff0c;在多线程那一章&#xff0c;很多常见面试题都没有讲&#xff0c;这里再来补充一下。 HashTable, HashMap, ConcurrentHashMap 之间的区别 HashTable, HashMap, ConcurrentHashMap 都带有Map&#xff0c;它们其实都是 Map 的接…

数据库设计软件Power Designer详解教程(附源码)

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl Power Designer概述 Power Designer 是美国Sybase公司的CASE工具集&#xff0c;利用Power Designer可分别从概念数据模型(Conceptual Data Model)和物理数据模型(Physical D…

如何查看某个starter的详细官方文档

\qquad 相信很多小伙伴在用到一个没怎么接触过的starter的时候&#xff0c;也有不知道怎么使用&#xff0c;怎么配置的苦恼&#xff0c;本文介绍一种大部分开源技术都能使用的查看官方文档的方式。 1.首先在github搜索相关技术 \qquad 这里以redis为例&#xff0c;如下&#x…