当前位置: 首页 > news >正文

SpringBoot 使用异步方法

SpringBoot 使用异步方法

在pom文件引入相关依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></dependency>

创建一个接收数据的实体:

@JsonIgnoreProperties(ignoreUnknown=true)
public class User {private String name;private String blog;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getBlog() {return blog;}public void setBlog(String blog) {this.blog = blog;}@Overridepublic String toString() {return "User [name=" + name + ", blog=" + blog + "]";}}

创建一个请求的 githib的service:

@Service
public class GitHubLookupService {private static final Logger logger = LoggerFactory.getLogger(GitHubLookupService.class);private final RestTemplate restTemplate;public GitHubLookupService(RestTemplateBuilder restTemplateBuilder) {this.restTemplate = restTemplateBuilder.build();}@Asyncpublic Future<User> findUser(String user) throws InterruptedException {logger.info("Looking up " + user);String url = String.format("https://api.github.com/users/%s", user);User results = restTemplate.getForObject(url, User.class);// Artificial delay of 1s for demonstration purposesThread.sleep(1000L);return new AsyncResult<>(results);}}

通过,RestTemplate去请求,另外加上类@Async 表明是一个异步任务。

开启异步任务:

@SpringBootApplication
@EnableAsync
public class Application extends AsyncConfigurerSupport {public static void main(String[] args) {SpringApplication.run(Application.class, args);}@Overridepublic Executor getAsyncExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(2);executor.setMaxPoolSize(2);executor.setQueueCapacity(500);executor.setThreadNamePrefix("GithubLookup-");executor.initialize();return executor;}}

通过@EnableAsync开启异步任务;并且配置AsyncConfigurerSupport,比如最大的线程池为2.

测试

测试代码如下:

@Component
public class AppRunner implements CommandLineRunner {private static final Logger logger = LoggerFactory.getLogger(AppRunner.class);private final GitHubLookupService gitHubLookupService;public AppRunner(GitHubLookupService gitHubLookupService) {this.gitHubLookupService = gitHubLookupService;}@Overridepublic void run(String... args) throws Exception {// Start the clocklong start = System.currentTimeMillis();// Kick of multiple, asynchronous lookupsFuture<User> page1 = gitHubLookupService.findUser("PivotalSoftware");Future<User> page2 = gitHubLookupService.findUser("CloudFoundry");Future<User> page3 = gitHubLookupService.findUser("Spring-Projects");// Wait until they are all donewhile (!(page1.isDone() && page2.isDone() && page3.isDone())) {Thread.sleep(10); //10-millisecond pause between each check}// Print results, including elapsed timelogger.info("Elapsed time: " + (System.currentTimeMillis() - start));logger.info("--> " + page1.get());logger.info("--> " + page2.get());logger.info("--> " + page3.get());}}

启动程序,控制台会打印:

2017-04-30 13:11:10.351 INFO 1511 — [ GithubLookup-1] com.forezp.service.GitHubLookupService : Looking up PivotalSoftware 2017-04-30 13:11:10.351 INFO 1511 — [ GithubLookup-2] com.forezp.service.GitHubLookupService : Looking up CloudFoundry 2017-04-30 13:11:13.144 INFO 1511 — [ GithubLookup-2] com.forezp.service.GitHubLookupService : Looking up Spring-Projects

耗时:3908

分析:可以卡的前面2个方法分别在GithubLookup-1 和GithubLookup-2执行,第三个在GithubLookup-2执行,注意因为在配置线程池的时候最大线程为2.如果你把线程池的个数为3的时候,耗时减少。

如果去掉@Async,你会发现,执行这三个方法都在main线程中执行。耗时总结,如下:

2017-04-30 13:13:00.934 INFO 1527 — [ main] com.forezp.service.GitHubLookupService : Looking up PivotalSoftware 2017-04-30 13:13:03.571 INFO 1527 — [ main] com.forezp.service.GitHubLookupService : Looking up CloudFoundry 2017-04-30 13:13:04.865 INFO 1527 — [ main] com.forezp.service.GitHubLookupService : Looking up Spring-Projects

耗时:5261

通过这一个小的栗子,你应该对异步任务有了一定的了解。

相关文章:

SpringBoot 使用异步方法

SpringBoot 使用异步方法 在pom文件引入相关依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframe…...

Django框架学习大纲

对于使用 Python 的 Django 框架进行 web 开发的程序员来说&#xff0c;以下几点是必须了解的。 环境配置与项目初始化 命令&#xff1a; pip install django django-admin startproject myproject解析&#xff1a; 使用 pip 安装 Django。使用 django-admin startproject …...

基于matlab实现的电力系统稳定性分析摆幅曲线代码

完整程序&#xff1a; clear; clc; t 0; tf 0; tfl 0.5; tc 0.5; % tc 0.05, 0.125, 0.5 sec for 2.5 cycles, 6.25 cycles & 25 cycles resp ts 0.05; m 2.52 / (180 * 50); i 2; dt 21.64 * pi / 180; ddt 0; time(1) 0; ang(1) 21.64; pm 0.9; pm1 2.44;…...

mybatis基本构成mybatis与hibernate的区别添加mybatis支持

目录 1. mybatis简介 2. mybatis基本构成 3. mybatis与hibernate的区别 4. 项目中添加mybatis支持 1. mybatis简介 Mybatis是Apache的一个Java开源项目&#xff0c;是一个支持动态Sql语句的持久层框架。Mybatis可以将Sql语句配置在XML文件中&#xff0c;避免将Sql语句硬编…...

c++23中的新功能之十四输入输出指针

一、介绍 在c的发展过程中&#xff0c;无论如何发展&#xff0c;c都尽量保持着与C语言的兼容&#xff0c;当然这也是它的一个特点。在实际的应用中&#xff0c;开发者经常遇到的一个问题是&#xff0c;如何把一个指针的值给传出来&#xff1f;有人会说&#xff0c;简单啊&…...

Day42:网易云项目,路由进阶

网易云项目 创建、启动项目并配置路由 npm init vite npm i npm i vue-router npm i sass -D 在main.js中 import router from ./router createApp(App).use(router).mount(#app) 在index中配置路由 import {createRouter,createWebHistory} from vue-router import H…...

Open3D(C++) 三维点云边界提取

目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 见:PCL 点云边界提取 二、代码实现 BoundaryEstimation.h #pragma...

AUTOSAR汽车电子嵌入式编程精讲300篇-经典 AUTOSAR 安全防御能力的分析及改善

目录 前言 研究现状 经典 AUTOSAR 概述 2.1 经典 AUTOSAR 架构 2.2 经典 AUTOSAR 应用层...

LeetCode 1584. 连接所有点的最小费用【最小生成树】

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…...

超简单,几行js代码就实现一个 vue3 的数字滚动效果!

预览效果 1. 创建一个template <template><div class"num-warp"><template v-for"item in numStr"><div v-if"item ," class"dot">,</div><divv-elseclass"num-box":style"{transf…...

两阶段鲁棒优化matlab实现——CCG和benders

目录 1 主要内容 2 部分代码 3 程序结果 4 程序链接 1 主要内容 程序采用matlab复现经典论文《Solving two-stage robust optimization problems using a column-and-constraint generation method》算例&#xff0c;实现了C&CG和benders算法两部分内容&#xff0c;通过…...

二进制安全虚拟机Protostar靶场(4)写入shellcode,基础知识讲解 Stack Five

前言 这是一个系列文章&#xff0c;之前已经介绍过一些二进制安全的基础知识&#xff0c;这里就不过多重复提及&#xff0c;不熟悉的同学可以去看看我之前写的文章 二进制安全虚拟机Protostar靶场 安装,基础知识讲解,破解STACK ZERO https://blog.csdn.net/qq_45894840/artic…...

【Flink实战】玩转Flink里面核心的Source Operator实战

&#x1f680; 作者 &#xff1a;“大数据小禅” &#x1f680; 文章简介 &#xff1a;【Flink实战】玩转Flink里面核心的Source Operator实战 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 目录导航 Flink 的API层级介绍Source Operator速览Flin…...

[2023-09-12]Oracle备库查询报ORA-01187

一个多表关联的语句在备库执行查询时提示ORA-01187: cannot read from file because it failed verification tests&#xff0c;单独对某一个表查询则正常返回&#xff08;因为不需要排序等&#xff0c;没有用到临时表空间&#xff09;。 查看报错信息发现是提示的临时数据文件…...

leetcode 16.最接近的三数之和

给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数&#xff0c;使它们的和与 target 最接近。 返回这三个数的和。 假定每组输入只存在恰好一个解。 示例 1&#xff1a; 输入&#xff1a;nums [-1,2,1,-4], target 1 输出&#xff1a;…...

antd table 自定义排序图标

要在Ant Design的Table组件中自定义排序图标&#xff0c;可以使用sorter和sortDirections属性来实现自定义排序逻辑和图标。以下是一个示例&#xff0c;演示如何在Ant Design的Table中自定义排序图标&#xff1a; import React, { useState } from react; import { Table, Spa…...

第十九章、【Linux】开机流程、模块管理与Loader

19.1.1 开机流程一览 以个人计算机架设的 Linux 主机为例&#xff0c;当你按下电源按键后计算机硬件会主动的读取 BIOS 或 UEFI BIOS 来载入硬件信息及进行硬件系统的自我测试&#xff0c; 之后系统会主动的去读取第一个可开机的设备 &#xff08;由 BIOS 设置的&#xff09; …...

GMAC PHY介绍

1.1PHY接口发展 &#xff08;1&#xff09;MII支持10M/100Mbps&#xff0c;一个接口由14根线组成&#xff0c;它的支持还是比较灵活的&#xff0c;但是有一个缺点是因为它一个端口用的信号线太多。参考芯片&#xff1a;DP83848 、DM900A&#xff08;该芯片内部集成了MAC和PHY接…...

华为OD机考算法题:最远足迹

目录 题目部分 解读与分析 代码实现 题目部分 题目最远足迹难度易题目说明某探险队负责对地下洞穴进行探险。 探险队成员在进行探险任务时&#xff0c;随身携带的记录器会不定期地记录自身的坐标&#xff0c;但在记录的间隙中也会记录其他数据。探索工作结束后&#xff0c;…...

QScrollBar滚动条、QSlider滑块、 QDial表盘

QAbstractSlider 类、 QSCrollBar 类、 QSlider 类 一、 基本原理 1、 QAbstractSlider 继承自 QWidget&#xff0c;该类主要用于提供一个范围内的整数值&#xff0c; 2、 QAbstractSlider 类是 QScrollBar 类(滚动条)、 QSlider 类(滑块)、 QDial 类(表盘)的父类&#xff0c;因…...

突破组织变革困境:两本不可错过的实战书籍推荐

组织变革大概是最难的一项管理工作之一。为了帮助大家更好地去理解变革管理的全过程&#xff0c;在这里推荐两本组织变革必读的经典书籍&#xff0c;认真读完它们你将能更从容地面对组织变革议题。一、《经理人参阅&#xff1a;变革管理》专门讲组织变革的书籍本来就在少数&…...

突破限制:跨设备使用三星笔记的开源技术方案

突破限制&#xff1a;跨设备使用三星笔记的开源技术方案 【免费下载链接】galaxybook_mask This script will allow you to mimic your windows pc as a Galaxy Book laptop, this is usually used to bypass Samsung Notes 项目地址: https://gitcode.com/gh_mirrors/ga/gal…...

OpenClaw调试技巧:百川2-13B任务失败时的6种排查方法

OpenClaw调试技巧&#xff1a;百川2-13B任务失败时的6种排查方法 1. 为什么需要专门的调试方法&#xff1f; 上周我让OpenClaw自动整理一批会议录音转文字稿&#xff0c;结果凌晨3点收到飞书报警——任务卡在"正在分析关键内容"阶段。第二天检查发现&#xff0c;百…...

【悬疑小说推荐】美女神探破奇案:《索女神探之银河谋杀法》

书名&#xff1a;《索女神探之银河谋杀法》 作者:追月逐花 出版社:贵州人民出版社 地址http://e.dangdang.com/products/1901196522.html 神秘女郎接连遇害&#xff0c;尸体均遭到严重损毁&#xff1b;神秘画像暗藏玄机&#xff0c;画中模特竟然是一具女尸。循着线索追查&am…...

终极指南:如何用SilentPatch彻底修复你的经典GTA游戏

终极指南&#xff1a;如何用SilentPatch彻底修复你的经典GTA游戏 【免费下载链接】SilentPatch SilentPatch for GTA III, Vice City, and San Andreas 项目地址: https://gitcode.com/gh_mirrors/si/SilentPatch 还在为经典GTA游戏的各种bug和兼容性问题烦恼吗&#xf…...

告别盲目下载:用STM32CubeIDE仿真功能在电脑上预演你的硬件行为

告别盲目下载&#xff1a;用STM32CubeIDE仿真功能在电脑上预演你的硬件行为 在嵌入式开发领域&#xff0c;每一次将程序烧录到硬件的过程都像是一次小小的冒险——你永远无法百分百确定代码在真实硬件上会如何表现。对于使用STM32系列芯片的开发者来说&#xff0c;这种不确定性…...

禾赛年报图解:营收30亿,经调整净利5.5亿 成激光雷达行业首家全年GAAP盈利企业

雷递网 雷建平 3月24日禾赛科技&#xff08;NASDAQ:HSAI&#xff1b;HKEX:2525&#xff09;今日公布了2025年第四季度以及全年未经审计的财务数据。财报显示&#xff0c;禾赛2025年营收为30.28亿元&#xff0c;较上年同期的20.77亿元增长45.8%。禾赛2025年运营利润为1.68亿元&a…...

软件安装包极致压缩与分发加速指南

软件安装包极致压缩与分发加速指南 【免费下载链接】romm A beautiful, powerful, self-hosted rom manager 项目地址: https://gitcode.com/GitHub_Trending/rom/romm 副标题&#xff1a;技术选型全解析 90%效率提升实践 自动化工具包 开发者痛点场景&#xff1a;当…...

Au新手入门指南:从零开始掌握音频编辑基础

1. 认识Adobe Audition&#xff1a;你的第一把音频手术刀 第一次打开Adobe Audition&#xff08;简称Au&#xff09;时&#xff0c;满屏的波形图和专业术语可能会让你头皮发麻。别担心&#xff0c;这就像第一次拿手术刀的外科实习生——工具看起来很专业&#xff0c;但基础操作…...

别再死记硬背了!用Python+NumPy手动画出OFDM正交子载波,秒懂频分复用原理

用PythonNumPy手绘OFDM正交子载波&#xff1a;从数学公式到动态可视化的沉浸式学习 在通信工程领域&#xff0c;正交频分复用(OFDM)技术如同一位优雅的舞者&#xff0c;在频谱的舞台上展现着精妙的协调性。这种技术不仅是现代4G/5G和Wi-Fi系统的核心&#xff0c;更是理解数字通…...