【RabbitMQ】注册成功后的通知操作

news2024/11/25 20:25:50

目录

  • 前提说明
  • 代码实现
    • 1. 依赖
    • 2. 配置类
    • 3. 生产方
    • 创建测试类,目的:查看是否队列交换机创建成功,且在队列里面是否有一条待消费的信息。
    • 4. 消费方
  • 最后

前提说明

背景条件:主要是自己学完了RabbitMQ后,想自己多去动手实践实践。

具体的需求:用户在注册成功以后,需要发送一条邮件消息,通知用户注册成功。

为什么要采用MQ

  • 巩固复习
  • 采用异步的操作,主要是为了避免容许出错操作的失败导致已经成功的操作回滚。

具体使用的技术

  • Springboot
  • RabbitMQ 3.11.4
  • Erlang 25.1
  • jdk 8

步骤图
在这里插入图片描述

  • 说一下,我为什么采用的是Direct 模式:

    假如以后需求需要变动的话,那么可以通过 改变routing key 来改变队列。

  • 文字阐述一下具体的步骤:

    1. 创建交换机以及队列,并实现他们的绑定关系
    2. 在生产方,也就是注册完成后,需要调用API去指定 交换机名 以及 队列名 以及 发送信息表示已经注册成功。
    3. 在消费方,如果有发送信息为注册成功,则表示我可以进行邮件发送操作了。
  • 考虑到注册成功后邮件发送的行为主要是一个辅助操作,不要求必须成功,所以不需要保证其操作必须成功。

代码实现

代码组成结构
在这里插入图片描述

1. 依赖


    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- RabbitMQ依赖    -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
    </dependencies>

2. 配置类

@Configuration
public class RabbitmqConfig {

    /**
     * 1. 创建交换机
     */
    @Bean
    public DirectExchange directExchange(){
        // 创建一条 DirectExchange 路由模式的交换机:名称为 order_direct_exchange,持久化,不自动删除
        return new DirectExchange("direct_exchange", true, false);
    }

    /**
     * 2. 创建队列
     */
    @Bean
    public Queue emailQueue(){
        // 构造一个新队列,指定名称emailQueue、持久性、可以绑定其他的交换机和不自动删除标志。
        return new Queue("emailQueue" , true, false,false );
    }

    /**
     * 3. 绑定队列以及交换机
     */
    @Bean
    public Binding emailDirectBinding(){
        return BindingBuilder.bind(emailQueue()).to(directExchange()).with("email");
    }
}

3. 生产方

@Service
public class UserServiceImpl {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    /**
     * 模拟业务操作
     */
    public void register(){
        // do something

        System.out.println("用户已经注册完成,开始异步用MQ发送消息,其中的routing key为:email,通知用户注册完成");
        // 向队列发送消息:队列名称为direct_exchange,路由key为email,发送主体为字符串registerSuccess
        rabbitTemplate.convertAndSend("direct_exchange", "email", "registerSuccess");
    }
}

创建测试类,目的:查看是否队列交换机创建成功,且在队列里面是否有一条待消费的信息。

@SpringBootTest
public class TestRegisterMQ {

    @Autowired
    private UserServiceImpl userServiceImpl;

    /**
     * 1、 进行生产测试,查看消息是否MQ已经发送到指定的Queue里面
     */
    @Test
    void testRegister(){
        userServiceImpl.register();
    }
}

此时,控制台打印出来:
在这里插入图片描述
在浏览器输入网址:http://localhost:15672,输入账户即可进入rabbitmq后台管理页面(默认为guest/guest)

可以查看到已经创建出队列以及交换机并且实现了绑定关系。
在这里插入图片描述
我们再查看队列里面是否有一条待消费的信息:
在这里插入图片描述
从上述步骤,我们就可以看出,已经生产出一条待消费的信息。

4. 消费方

// 监听的队列为 emailQueue
@RabbitListener(queues = {"emailQueue"})
@Service
public class EmailServiceImpl {

    // 通过传递的不同发送主体,进行消息处理
    @RabbitHandler
    public void sendEmail(String msg){
        System.out.println("消息方接收到的消息为" + msg);
        System.out.println("现在正在进行邮件发送处理。。。。。。");
        // do something
    }
}

启动主启动类,会看到消息已经被消费:

控制台是确定是否已经接受到信息:
在这里插入图片描述
我们进一步确认,在队列里面阻塞的消息是否已经被消费:
在这里插入图片描述

最后

至此,一个简单的使用场景就已经实现完毕了。

如果对RabbiMQ有不了解的地方,可以查看相应的笔记:【RabbitMQ】学习笔记

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

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

相关文章

基于SSM的教务管理系统设计与实现

技术&#xff1a;Java、JSP等摘要&#xff1a;伴随着数字化、网络化、信息化发展的社会&#xff0c;越来越多的行业与时俱进融入到了互联网中&#xff0c;而高校作为为了一个更是培养各色人才之地&#xff0c;更是拥有大量的高科技人才&#xff0c;因此也更应该运用科技来完善教…

单片机开发---ESP32S3移植NES模拟器(二)

书接上文 《单片机开发—ESP32-S3模块上手》 《单片机开发—ESP32S3移植lvgl触摸屏》 《单片机开发—ESP32S3移植NES模拟器&#xff08;一&#xff09;》 暖场视频&#xff0c;小时候称这个为—超级曲线射门&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&am…

Linux 安装jenkins和jdk11

Linux 安装jenkins和jdk111. Install Jdk112. Jenkins Install2.1 Install Jenkins2.2 Start2.3 Error3.Awakening1.1 Big Data -- Postgres4. Awakening1. Install Jdk11 安装jdk11 sudo yum install fontconfig java-11-openjdk 2. Jenkins Install 2.1 Install Jenkins 下…

八、Linux文件 - 文件IO与标准IO的区别

目录 1.Linux标准文件描述符 2.缓存的概念 1.Linux标准文件描述符 文件描述符缩写描述0STDIO标准输入1STDOUT标准输出2STDERR标准错误输出文件IO&#xff1a;是直接调用内核提供的系统调用函数&#xff0c;头文件时unistd.h标准IO&#xff1a;是间接调用系统调用函数&#x…

C语言经典编程题100例(21-40)

21、练习3-2 计算符号函数的值对于任一整数n&#xff0c;符号函数sign(n)的定义如下&#xff1a;请编写程序计算该函数对任一输入整数的值。输入格式:输入在一行中给出整数n。输出格式:在一行中按照格式“sign(n) 函数值”输出该整数n对应的函数值。输入样例1:10输出样例1:sig…

LeetCode刷题系列 -- 54. 螺旋矩阵

给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。示例 1&#xff1a;输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]]输出&#xff1a;[1,2,3,6,9,8,7,4,5]示例 2&#xff1a;输入&#xff1a;matrix [[1,2,3,4],[…

Nextcloud通过不被信任的域名访问解决方法 Nextcloud 您正在访问来自不信任域名的服务器

windows电脑在网页端输入“http://192.168.xxx.xxx:8080/login”访问远程ubuntu18.04服务器&#xff0c;访问其docker镜像的Nextcloud&#xff0c;提示“”Nextcloud通过不被信任的域名访问解决方法 Nextcloud 您正在访问来自不信任域名的服务器“”&#xff0c;如下图&#xf…

Jetpack Compose中的绘制流程和自定义布局

Jetpack Compose中绘制流程的三个阶段 与大多数其他界面工具包一样&#xff0c;Compose 会通过几个不同的“阶段”来渲染帧。如果我们观察一下 Android View 系统&#xff0c;就会发现它有 3 个主要阶段&#xff1a;测量、布局和绘制。Compose 和它非常相似&#xff0c;但开头…

2023年java面试题之kafka(5道)

一. kafka介绍&#xff1a; 1.消息分类按不同类别,分成不同的Topic,Topic⼜拆分成多个partition,每个partition均衡分散到不同的服务器(提⾼并发访问的能⼒) 2.消费者按顺序从partition中读取,不⽀持随机读取数据,但可通过改变保存到zookeeper中的offset位置实现从任意位置开…

golang 优雅关闭服务

文章目录一、什么是优雅关闭服务二、使用函数三、使用案例一、什么是优雅关闭服务 先把在执行的任务执行完成&#xff0c;再关闭服务&#xff0c;防止中断服务造成程序错误&#xff0c;数据异常等影响。 二、使用函数 语法&#xff1a; Shutdown(ctx context.Context) error作…

深度学习之循环神经网络(RNN)实现股票预测

深度学习训练营之循环神经网络&#xff08;RNN&#xff09;实现股票预测原文链接环境介绍前置工作设置GPU数据加载划分数据集模型训练数据预处理归一化对样本进行构建构建模型激活模型对模型进行训练结果可视化预测模型评估原文链接 &#x1f368; 本文为&#x1f517;365天深度…

【Python案例实战】爬虫能做哪些很酷很有趣很有用的事情?爱了爱了,简直是神仙代码~(淘宝秒杀、VIP视频解析、wiwi破解等)

前言 &#x1f680; 作者 &#xff1a;“程序员梨子” &#x1f680; **文章简介 **&#xff1a;本篇文章主要是写了opencv的人脸检测、猫脸检测小程序。 &#x1f680; **文章源码免费获取 &#xff1a; 为了感谢每一个关注我的小可爱&#x1f493;每篇文章的项目源码都是无 偿…

Spring Cloud组件

1.服务治理 Spring Cloud Eureka 概念 Eureka提供了服务端组件&#xff0c;我们也称为注册中心。每个服务都向Eureka的服务注册中心&#xff0c;登记自己提供服务的元数据&#xff0c;包括服务的ip地址、端口号、版本号、通信协议等。 原理 服务注册中心&#xff0c;还会以心跳…

【DOCKER】容器概念基础

文章目录1.容器1.概念2.特点3.与虚拟机的对比2.docker1.概念2.命名空间3.核心概念3.命令1.镜像命令2.仓库命令1.容器 1.概念 1.不同的运行环境&#xff0c;底层架构是不同的&#xff0c;这就会导致测试环境运行好好的应用&#xff0c;到了生产环境就会出现bug&#xff08;就像…

DevOps在项目交付场景下的应用

DevOps介绍 DevOps一词是由development和operation两个单词组合而来&#xff0c;代表着研发和交付运营的一体化。DevOps在2009年就被提出&#xff0c;但在学术界和工业界还没有一个广泛认可的定义&#xff0c;一些有代表性的总结&#xff0c;比如John Willis从文化、自动化、度…

策略编制解决方案

策略编制 NetIQ 使您能够将 AD 策略扩展到整个 IT 生态系统&#xff0c;并集中管理和监控策略与配置更改。 一、优点 提高 IT 管理员效率 集中管理策略控制。 借助可见性降低风险 借助实时监控减少漏洞。 审计和合规性报告 采取措施以满足安全条例和策略的合规要求。 二、…

应用部署初探:微服务的3大部署模式

在之前的文章中&#xff0c;我们已经充分了解了应用部署的4种常见模式&#xff08;金丝雀部署、蓝绿部署、滚动部署及影子部署&#xff09;。随着云原生技术逐步成熟&#xff0c;企业追求更为灵活和可扩展的系统&#xff0c;微服务架构大行其道。 微服务固然有诸多优点&…

计算组合数Cnk即从n个不同数中选出k个不同数共有多少种方法math.comb(n,k)

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 计算组合数Cnk 即从n个不同数中选出k个不同数共有多少种方法 math.comb(n,k) 以下python代码输出结果是? import math print("【执行】print(math.comb(3,1))") print(math.comb(…

一文了解kafka消息队列,实现kafka的生产者(Producer)和消费者(Consumer)的代码,消息的持久化和消息的同步发送和异步发送

文章目录1. kafka的介绍1.2 Kafka适合的应用场景1.2 Kafka的四个核心API2. 代码实现kafka的生产者和消费者2.1 引入加入jar包2.2 生产者代码2.3 消费者代码2.4 介绍kafka生产者和消费者模式3. 消息持久化4. 消息的同步和异步发送5. 参考文档1. kafka的介绍 最近在学习kafka相关…

Ubuntu20.04+cuda11.2+cudnn8.1+Anaconda3安装tensorflow-GPU环境,亲测可用

(1)安装nvidia显卡驱动注意Ubuntu20.04和Ubuntu16.04版本的安装方法不同,安装驱动前一定要更新软件列表和安装必要软件、依赖&#xff08;必须&#xff09;sudo apt-get update #更新软件列表sudo apt-get install gsudo apt-get install gccsudo apt-get install make查看GP…