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

文章目录

  • 消息队列
    • 概述
    • 两大种类
    • 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 {@Beanpublic 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@Beanpublic RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);this.rabbitTemplate = rabbitTemplate;rabbitTemplate.setMessageConverter(messageConverter());initRabbitTemplate();return rabbitTemplate;}@Beanpublic 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*/@Beanpublic 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*/@Beanpublic Queue orderReleaseQueue() {return new Queue(MqConstants.ORDER_RELEASE_ORDER_QUEUE, true, false, false);}/*** @Description 创建order交换机* @Author WSKH*/@Beanpublic 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*/@Beanpublic 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*/@Beanpublic Binding orderReleaseBinding() {return new Binding(MqConstants.ORDER_RELEASE_ORDER_QUEUE,Binding.DestinationType.QUEUE,MqConstants.ORDER_EVENT_EXCHANGE,"order.release.order",null);}
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Spring Cloud Alibaba Seata 处理分布式事务】——每天一点小知识

&#x1f4a7; S p r i n g C l o u d A l i b a b a S e a t a 处理分布式事务 \color{#FF1493}{Spring Cloud Alibaba Seata 处理分布式事务} SpringCloudAlibabaSeata处理分布式事务&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f98…

基于Elasticsearch + Fluentd + Kibana(EFK)搭建日志收集管理系统

目录 1、EFK简介 2、EFK框架 2.1、Fluentd系统架构 2.2、Elasticsearch系统架构 2.3、Kibana系统架构 3、Elasticsearch接口 4、EFK在虚拟机中安装步骤 4.1、安装elasticsearch 4.2、安装kibana 4.3、安装fluentd 4.4、进入kibana创建索引 5、Fluentd配置介绍 Elas…

WWDC 23 之后的 SwiftUI 有哪些新功能

文章目录 前言数据流动画ScrollView搜索新手势新增的小功能总结 前言 WWDC 23 已经到来&#xff0c;SwiftUI 框架中有很多改变和新增的功能。在本文中将主要介绍 SwiftUI 中数据流、动画、ScrollView、搜索、新手势等功能的新变化。 数据流 Swift 5.9 引入了宏功能&#xff…

【FPGA】Verilog:时序电路 | 触发器电路 | 上升沿触发 | 同步置位 | 异步置位

前言&#xff1a;本章内容主要是演示Vivado下利用Verilog语言进行电路设计、仿真、综合和下载 示例&#xff1a;触发器电路 ​ 功能特性&#xff1a; 采用 Xilinx Artix-7 XC7A35T芯片 配置方式&#xff1a;USB-JTAG/SPI Flash 高达100MHz 的内部时钟速度 存储器&#xff1a;…

VS2022 And QtCreator10 调试 Qt 源码教程

文章目录 背景IDE 调试 Qt 源码Visual Studio 2022Qt Creator 10.0.1 排查思路姊妹篇系列 简 述&#xff1a; 记录使用 Visual Studo 2022 和 QtCreator10 调试 Qt 5.15 源码和 加载 .pdb 的方法。 本文初发于 “偕臧的小站”&#xff0c;同步转载于此。 背景 源码&#xff1a;…

软考A计划-系统集成项目管理工程师-项目范围管理(一)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

C# Excel 表列序号

171 Excel 表列序号 给你一个字符串 columnTitle &#xff0c;表示 Excel 表格中的列名称。返回 该列名称对应的列序号 。 例如&#xff1a; A -> 1 B -> 2 C -> 3 … Z -> 26 AA -> 27 AB -> 28 … 示例 1: 输入: columnTitle “A” 输出: 1 示例 2: …

数据库原理之数据库事物

文章目录 一、事物介绍1.1 事物的目的是保证数据的一致性1.2 事物的ACID A、I、D是为了实现 C1.3 什么是本地事物(Local Transactions) 二、数据库系统如何实现ACID2.1 影响深远的ARIES理论2.2 本地事物如何实现原子性和持久性 A、D2.2.1 实现原子性和持久性的Commit Logging方…

基于物联网、区块链技术的质量管控防伪溯源系统源码

一物一码防伪溯源系统能准确获取产品生产经营各个环节的真实信息&#xff0c;利用物联网、云计算 、区块链、人工智能、5G等先进技术&#xff0c;结合特有的码码关联和RSA加密验证技术&#xff0c;建立区块链的“身份证”&#xff0c;针对产品生长到销售各环节的质量安全数据进…

结构体和数据结构--结构体数组的定义和初始化

目录 一、结构体数组的定义 二、结构体数组的初始化 一、结构体数组的定义 一个结构体变量只能表示学生成绩管理表中的一个学生的记录信息&#xff0c;代表其中的一个实例&#xff0c;而实际数据库中有多个学生的记录&#xff0c;每个记录对应一个学生的信息&#xff0c;如何…

MySQL----MHA高可用

文章目录 一、MHA理论1.1什么是 MHA1.2MHA 的组成1.3MHA 的特点 二、MHA的一主两从部署实验设计故障修复步骤&#xff1a; 一、MHA理论 1.1什么是 MHA MHA&#xff08;MasterHigh Availability&#xff09;是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 MHA 的出…

初识Docker:(7)查询Docker镜像的DockerFile

1. 前言 我们知道了根据dockerfile来制作镜像&#xff0c;如果给你一个现成的镜像&#xff0c;你能逆向查看出dockerfile吗&#xff1f; 否则&#xff0c;你怎么知道该镜像使用的是CMD还是ENTRYPOINT &#xff0c;使用的是shell格式还是CMD格式&#xff1f;由于格式决定了doc…