Spring Boot异步任务、异步消息

news2025/1/18 20:27:25

目录

1.异步任务

1.1.概述

1.2.使用

2.异步消息

2.1.概述

2.2.使用


1.异步任务

1.1.概述

举一个例子,我现在有一个网上商城,客户在界面点击下单后,后台需要完成两步:

  • 1.创建客户订单

  • 2.发短信通知客户订单号

这里面第2步是个高耗时的操作,如果全部挤在一条主线程里做,效果就会是客户点了一下界面的下单按钮,然后转半天圈,直到客户收到短信后,界面才停止转圈。

这里面我们发现其实我们并不需要等第2步完全跑完再返回,只要调用触发低2步就可以返回了。

第2步很适合做成异步任务,只要触发了就行,快速给出响应,不让请求卡在接口上,不必等它完整做完。

1.2.使用

spring提供了一个AsyncConfigurer接口,用来支持我们自定义一个线程池作为异步任务的线程池。

1.AsyncConfigurer接口:

package org.springframework.scheduling.annotation;

import java.util.concurrent.Executor;
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.lang.Nullable;

public interface AsyncConfigurer {
	//获取线程池
    @Nullable
    default Executor getAsyncExecutor() {
        return null;
    }
    
	//异步异常处理器
    @Nullable
    default AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return null;
    }
}

2.自定义一个异步线程池:

@Configuration
@EnableAsync //开启Spring对异步的支持
public class AsyncConfig implements AsyncConfigurer {
    @Override
    public Executor getAsyncExecutor() {
        //定义线程池
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        //核心线程数
        taskExecutor.setCorePoolSize(10);
        //线程池最大线程数
        taskExecutor.setMaxPoolSize(30);
        //线程队列最大线程数
        taskExecutor.setQueueCapacity(2000);
        //初始化
        taskExecutor.initialize();
        return taskExecutor;
    }
}

3.使用异步任务:

用@Async注解的方法会交给自定义的异步线程池来执行。

@Async注解的接口只要将任务交给线程池里面的线程后就会快速返回响应,而不会等方法执行完。

import org.springframework.scheduling.annotation.Async;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {

    @RequestMapping("test")
    @Async
    public void test(){
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName());
    }
}

2.异步消息

2.1.概述

有时候,点对点的消息传送可能出现消费能力跟不上生产能力导致数据积压的情况出现,这时候异步消息就派上了用场。

以1.1章节中举例的场景为例,发短信的线程和客户之间就是点对点的,只要订单下得够快,线程池很快还是会被打满:

 这时候我们就需要将这种点对点的同步关系,通过MQ这个中间层解为异步的关系:

2.2.使用

异步消息其实本质上就是将数据放到MQ中,以下是博主写的用Spring Boot操作rabbitMQ的文章,清晰易懂,可以参考,至于其它MQ的话,术有千法,道本归一:

SpringBoot RabbitMq 六大模式_springboot整合rabbitmq六种模式__BugMan的博客-CSDN博客

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

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

相关文章

selenium 连接已经打开的chrome浏览器 MAC

selenium 连接已经打开的chrome浏览器 MAC 一,前言 今天在爬取chatGPT的谷歌插件的prompts的时候,发现绕不过他的反爬机制,失败111,所以想用连接已打开的chatGPT页面进行控制 二,具体步骤 1,添加环境变…

Android入门

一、Android系统架构 Android大致可以分为4层架构:Linux内核层、系统运行库层、应用框架层和应用层 1.1Linux内核层 Android系统是基于Linux内核的,这一层为Android设备的各种硬件提供了如显示、音频、照相机、蓝牙、Wi-Fi等底层的驱动。 1.2系统运行层…

2023MathorCup 高校数学建模挑战赛D题思路解析

如下为MathorCup 高校数学建模挑战赛D题思路解析: D 题 航空安全风险分析和飞行技术评估问题 飞行安全是民航运输业赖以生存和发展的基础。随着我国民航业的快速发展,针对飞行安全问题的研究显得越来越重要。2022 年 3 月 21 日,“3.21”空难…

如何使用vim的插件Ctags查看Linux源码

一.ubuntu下安装Linux内核源码 (1).查看自己的内核版本 (2).查看源内的内核源码类表 (3).下载源码 (4).进入/usr/src (5).解压下载的文件到用户主 二.安装vim插件Ctags和使用 插件的介绍 Ctags工具是用来遍历源代码文件生成tags文件,这些tags文件能被编辑器或其它工…

2023年的深度学习入门指南(4) - 在你的电脑上运行大模型

2023年的深度学习入门指南(4) - 在你的电脑上运行大模型 上一篇我们介绍了大模型的基础,自注意力机制以及其实现Transformer模块。因为Transformer被PyTorch和TensorFlow等框架所支持,所以我们只要能够配置好框架的GPU或者其他加速硬件的支持&#xff0…

同为科技(TOWE)防雷科普篇1—雷电灾害认识与雷电预警信号解读

前 言 雷电是自然界最为壮观的大气现象之一。其强大的电流、炙热的高温、猛烈的冲击波以及强烈的电磁辐射等物理效应能够在瞬间产生巨大的破坏作用,常常导致人员伤亡,击毁建筑物、供配电系统、通信设备,造成计算机信息系统中断,引…

电风扇出口欧美CE/UL507认证办理

电风扇简称电扇,是一种利用电动机驱动扇叶旋转,来达到使空气加速流通的家用电器,主要用于清凉解暑和流通空气。风扇主要由扇头、叶片、网罩和控制装置等部件组成。电风扇的主要部件是:交流电动机。其工作原理是:通电线圈在磁场中受力而转动。…

Streamlit 中函数多次进入的问题

Streamlit 函数多次进入的问题 Streamlit 学习的背景重要案例心得踩坑或注意点 Streamlit 学习的背景 最近在学习ai相关的知识,同时需要做一些方便使用的web网页。 例如:调用chatGPT的api,做对话窗。 之前用过gradio, 但是发现在手机端上&am…

NestJS:理解ORM(Object Relational Mapping)

一、理解ORM(Object Relation Mapping) ORM是对象—关系映射(Object/Relation Mapping,ORM)是为了解决面向对象与关系数据库存在的互不匹配现象而产生的技术。业务实体在内存中表现为对象,在数据库中表现为关系数据。ORM通过使用描…

【网络技术】HULK攻击实验

一、重要声明 请勿攻击公网!请勿攻击公网!请勿攻击公网! 一切责任自负!一切责任自负!一切责任自负! 二、工具介绍 HULK(Http Unbearable Load King,字面意思是“不能承受的HTTP&a…

项目三:双人骰子

项目三:双人骰子 文章目录 项目三:双人骰子一、导入(5分钟)学习目的 二、新授(65分钟)1.预展示结果(5分钟)2.本节课所用的软硬件(5分钟)3.硬件介绍(1分钟)4.图形化块介绍(1分钟)5.单个模块的简单使用(1分钟)6.双人骰子编程逻辑分析(30分钟)7.…

Faster RCNN系列——RoI Pooling与全连接层

在RPN网络中,已经计算过一次类别真值与类别预测值、偏移量真值与偏移量预测值之间的损失值,但这里的类别预测值只包含两类:前景和背景。 RPN网络输出的Proposal作为生成的区域,继续在后续的RoI Pooling和全连接层中进行分类与回归…

企业电子招投标系统源码之电子招投标系统建设的重点和未来趋势

项目说明 随着公司的快速发展,企业人员和经营规模不断壮大,公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境,最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范,以及…

性能优化3-分帧寻路+寻路任务统一管理

前言 当项目里的地图越来越大,一些性能上的问题开始逐渐出现,比如寻路。玩家在操控角色移动的时候,指引需要实时更新,同时一些npc也需要做移动,容易出现cpu占用率短时间过高,甚至掉帧的情况。 去年底的时候…

ChatGPT,音乐,与数据库

小编君是个不务正业,喜欢搞跨界,干啥啥不成的DBA,大概在十一年前就有个不成熟的妄念,能否用计算机来写音乐? ▌用ChatGPT来搞音乐? 音乐是一个个的音符,按照乐理规则排列的。音符之间是否和谐…

横扫一线大厂面试的高并发笔记到底有多硬核?

处处需要高并发 “为什么Java面试必问高并发?” 这个问题已经让程序员们倍感头疼,尤其是想要跳槽到更大公司的程序员,能否漂亮的回答高并发的问题已经成为求职者是否是一个优秀程序员的评判标准,大厂面试尤为明显。 不得不说&am…

springMvc(二)

一、SSM整合 前面我们已经把 Mybatis 、 Spring 和 SpringMVC 三个框架进行了学习,今天主要的内容就是把这三个 框架整合在一起完成我们的业务功能开发,具体如何来整合,我们一步步来学习。 1.1 流程分析 (1) 创建工程 创建一个Maven的we…

BUUCTF-PWN-ciscn_2019_n_1

1.溢出到shell位置 下载文件 checksec file 发现是64位的 然后 放入ida 查看字符串 发现 cat flag 然后看看 F5反编译 我们发现了system 然后get()函数 我们可以使用栈溢出 我们看看 v1函数的地址 是30h 然后是64位的 所以 基地址是8字节 我们开始查看 system的地址 所以…

Web3 营销:项目方如何使用空投奖励以及激励真实用户

Apr. 2023, Daniel 在GameFi中,举行成功的空投活动是最难做到的事情之一。 虽然今年Arbitrum和Blur的活动再次使空投成为一个热门话题,但通过空投赚取收益造成了一个机器人问题,即空投者使用多个账户来进入游戏系统。 Trading volume on Bl…

【LeetCode】剑指 Offer 61. 扑克牌中的顺子 p298 -- Java Version

题目链接:https://leetcode.cn/problems/bu-ke-pai-zhong-de-shun-zi-lcof/ 1. 题目介绍(61. 扑克牌中的顺子) 从若干副扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身…