Spring Boot异步任务、异步消息

article/2025/9/18 2:20:03

目录

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 {//获取线程池@Nullabledefault Executor getAsyncExecutor() {return null;}//异步异常处理器@Nullabledefault AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {return null;}
}

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

@Configuration
@EnableAsync //开启Spring对异步的支持
public class AsyncConfig implements AsyncConfigurer {@Overridepublic 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")@Asyncpublic 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://chatgpt.dhexx.cn/article/SL6jEGEq.shtml

相关文章

python_异步

深入理解 Python 异步编程 前言 很多朋友对异步编程都处于“听说很强大”的认知状态。鲜有在生产项目中使用它。而使用它的同学,则大多数都停留在知道如何使用 Tornado、Twisted、Gevent 这类异步框架上,出现各种古怪的问题难以解决。而且使用了异步框架…

httpx 与 异步

前言 HTTPX 是新一代的 python 解析库,它是一个功能齐全的 HTTP 客户端,用于Python 3,较requests(只能发送同步请求)和 aiohttp(只能发送异步请求)不同的是,它同时提供同步和异步 AP…

一文了解异步编程基础

什么是异步编程? 异步编程是指并发编程的范式,其中除了单个主应用程序线程之外,工作可以委托给一个或多个并行工作线程。这被称为非阻塞系统,其中整体系统速度不受订单执行的影响,并且多个进程可以同时发生。 函数从 …

异步函数async

什么是同步异步 在最新的ES7(ES2017)中提出的前端异步特性:async、await。 在了解async和await之前得先明白什么是同步函数,什么是异步函数。 同步函数:当一个函数是同步执行时,那么当该函数被调用时不会…

异步(async、await)

同步与异步 同步:如果一个程序调用某个方法,等待其执行所有处理后才继续执行,我们就称这样的方法是同步的,这是默认的形式异步:异步的方法在处理完成之前就返回到调用方法,C#的async/await特性可以创建并使…

async/awiat和promise之间的区别

今天看到了一段代码 async function async1() {console.log(async1 start);await async2();console.log(async1 end); } async function async2() {console.log(async2); } console.log(script start); setTimeout(function() {console.log(setTimeout); }, 0) async1(); new …

什么是异步

文章目录 前言一、异步是什么?二、举个例子来理解异步 1.异步最典型的例子就是“回调函数”总结 前言 在vue的过程中,我们一定会遇到诸如: function(参数).then(res>{}) 形式的代码。到底怎么编译执行的呢 &#x…

Spring Boot 基础学习之(五)页面通过自定义LocaleResolver组件实现网页页面的的中英文转换

本次项目所有能够使用的静态资源可以免费进行下载 静态资源 在前端网页,是不是看见过这样的功能 基础网页:中文表示 点击下面的English 按钮网页显示文字开始切换 通过功能性按钮实现中英文切换,在浏览器中,都带着一个功能叫翻…

网页中文转英文(国际化)

背景: 我的项目是已经完成的项目,因为要拓展海外市场,需要支持英文。 采用的方式是添加配置文件,见下文详细步骤。 本文基本转自:http://blog.csdn.net/wuhawang/article/details/52228589 在他的基础上给大家一点提示…

英语数字转换器

英语数字转换器 STL中map,stack和string的运用 描述: 在这个问题中,将用英语给你一个或多个整数。你的任务是将这些数字转换成整型表示。数字范围从-999,999,999到999,999,999.下面是你的程序必须考虑的详尽的英语单词表: neg…

Unity 中英文转换

在Resources下创建文件夹LanguageTxt,再其创建“Chinese.txt”及“English.txt”(记得保存文本时选择UTF-8) Chinese.txt Btn:这是一个按钮 English.txt Btn:This is a button 在Scripts下创建“LanguageManager.cs”及“UIText.cs” L…

SAP中英文转换--中文转英文

中文转英文-函数:CONVERSION_EXIT_CUNIT_INPUT CALL FUNCTION ‘CONVERSION_EXIT_CUNIT_INPUT’ EXPORTING input “输入的中文单位 IMPORTING output “输出的英文单位 效果图:

SAP 中英文转换-英转中

英文转中文-函数:CONVERSION_EXIT_CUNIT_OUTPUT CALL FUNCTION ‘CONVERSION_EXIT_CUNIT_OUTPUT’ EXPORTING input “输入的英文单位 IMPORTING output “输出的中文单位

将数字转换为中文

功能需求 做公司项目遇到一个有关交易金额(合同签订书)的内容,需要将查询出来的交易金额转化为中文数字,例如:壹拾捌万伍仟元整(185000.00) 需求分析 因为合同书中的数据都是动态的&#xff0c…

Java 16进制报文转换中英文报文(通过字节转换)

最近在搞这个16进制报文,网上找了很多地方,解出来的结果不是乱码就是报错,干脆自己写了。 大概是这样的,16进制的报文大家都知道是什么样子 例如: 3C E4 BA A4 E6 98 93 E6 88 90 E5 8A 9F EF BC 81 3E 20 3C 42 61 6B 31 2F 3E 因为其中包…

通过C#进行中英文转换

通过C#进行中英文转换 编写相应语言的XML文件&#xff0c;添加xml文件 ChineseSimplified.xml文件内容 <?xml version"1.0" encoding"GB2312" ?> <Softimite Language"12"><Form><Name>LoginForm</Name><…

【Adobe After Effects中英文转换2019——2023版】

** Adobe After Effects中英文转换2019——2023版 ** 如果是默认安装的软件&#xff0c;在桌面右击AE图标&#xff0c;点击打开文件所在位置&#xff0c;来到软件安装目录 C:\Program Files\Adobe\Adobe After Effects 2023\Support Files 找到AMT文件夹 点击进入&#xf…

在线中英文符号转换工具

在线中英文符号转换工具 在线中英文符号转换工具 将中文符号转换成英文符号或将英文符号转换成中文符号&#xff0c; 将单引号‘’都转换成’&#xff0c; 将双引号“”都转换成" 将中括号【】转换成[]&#xff0c; 将大括号&#xff5b;&#xff5d;转换成{} 将逗号&…

英文表格如何快速转换为中文?

今天跟大家分享一下英文表格如何快速转换为中文&#xff1f; 1.首先打开Excel文件&#xff0c;选中要翻译的单元格&#xff0c;点击【DIY工具箱】 ​ 2.点击【翻译】 3.选择【有道翻译】 4.将翻译语言设置为中文&#xff0c;然后点击【确定】 5.鼠标点击一个合适的单元格作为翻…

英文转换-在线英文批量转换器免费

英文转换&#xff0c;怎么找到好的英文转换器&#xff1f;今天给大家分享一款免费批量的英文转换器汇集了世界最好的几个翻译平台&#xff08;百度/谷歌/有道&#xff09;&#xff0c;为什么这么多人使用它&#xff1f;首先第一点翻译质量高&#xff0c;选择性多。第二点可以批…