Srping注解之@Async:SpringBoot 实现异步调用

news2024/12/24 10:14:12

目录

1:前言

2:如何创建线程池

3:自定义线程池 


1:前言

        在日常开发过程中,会遇到一些需求是和主业务逻辑低耦合的,不要求和主业务逻辑同步进行,比如记录日志信息、发送消息通知电子邮件、生成PDF合同和导出报表等需求,而且,这些需求往往处理起来比较耗时。这个时候就需要开启新线程处理这些耗时多的业务,为主业务逻辑以最快速度执行完毕保驾护航。

2:如何创建线程池

      在Spring Boot项目中通过注解开启异步线程,仅仅需要做两件事情:

        ① 在启动类添加注解@EnableAsync,开启异步调用。

        ②在方法上添加注解@Async("yourThreadPool"),其中,yourThreadPool为自定义线程池,可以使用系统默认线程池。

3:自定义线程池 

新建Async.java配置类:

package com.xxxx.demoend.common;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * @Author 
 * @Date Created in  2023/5/17 9:24
 * @DESCRIPTION:
 * @Version V1.0
 */

@EnableAsync//由于这个配置类中添加了@EnableAsync注解,故在项目启动类中就不必再次添加了。
@Configuration
public class Async {
   @Bean("east7TaskExecutor")
   public Executor taskExecutor() {
      ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();

      //corePoolSize:线程池创建时候初始化的线程数;
      executor.setCorePoolSize(10);

      //maxPoolSize:线程池最大的线程数,只有在缓冲队列满了之后才会申请超过核心线程数的线程;
      executor.setMaxPoolSize(20);

      //queueCapacity:用来设置缓冲队列的容量,Set the capacity for the ThreadPoolExecutor's BlockingQueue.
      executor.setQueueCapacity(200);

      //keepAliveSeconds:允许线程的空闲时间60秒,当超过了核心线程数外的线程在空闲时间到达之后会被销毁;
      executor.setKeepAliveSeconds(60);

      //threadNamePrefix:线程池名的前缀,用于快速定位当前任务所在的线程池;
      executor.setThreadNamePrefix("east7Task-");

      //rejectedExecutionHandler:线程池对拒绝任务的处理策略,这里采用了CallerRunsPolicy;
      executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());

      //waitForTasksToCompleteOnShutdown:默认值为false,这里赋值true,
      // 用来设置线程池关闭的时候等待所有任务都完成再继续销毁其他的Bean,
      // 这样这些异步任务的销毁就会先于其它对象(如数据库连接池对象)销毁;
      executor.setWaitForTasksToCompleteOnShutdown(true);

      //awaitTerminationSeconds:设置线程池中任务的等待时间,
      // 如果超过这个时间还没有销毁就强制销毁,以确保应用最后能够被关闭,而不被阻塞。
      executor.setAwaitTerminationSeconds(60);
      return executor;
   }
}

TestController.java

@RestController
@RequestMapping("test")
@Slf4j
@CrossOrigin
public class Test {

    @Resource
    private UserService userService;

    @GetMapping("/testSync")
    public void testSync() {

        userService.hello();
        String date = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        log.info("testSync 方法继续执行,当前时间:{}", date);
        log.error("执行结束");
    }
}


///
   @Async("east7TaskExecutor")
   public void hello() {
      try {
         log.info("同学们,课间休息时间到了");
         Thread.sleep(3000);
         String date = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));

         log.warn("休息结束,继续上课,当前时间:{}", date);
      } catch (InterruptedException e) {
         log.error("执行失败", e);
      }
   }

结束喽,感兴趣可以加入我的社区:感谢

https://bbs.csdn.net/forums/9cd650b7a75f4ed68f8fbd9da48fd774?spm=1001.2014.3001.6682icon-default.png?t=N3I4https://bbs.csdn.net/forums/9cd650b7a75f4ed68f8fbd9da48fd774?spm=1001.2014.3001.6682

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

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

相关文章

Elasticsearch:使用 count API 来获得所有文档的个数

在我开始使用 Elasticsearch 的时候,我希望获得给定查询的文档总数。比如我们想对数据进行分页显示。从 Elasticsearch 7.0之后,为了提高搜索的性能,在 hits 字段中返回的文档数有时不是最精确的数值。Elasticsearch 限制了最多的数值为10000…

【开发者指南】如何在MyEclipse中编辑HTML或JSP文件?(一)

MyEclipse v2022.1.0正式版下载 如果您有HTML或JSP文件要编辑,这里将介绍如何编辑。查找以下信息: 编辑源代码大纲和属性视图参数页面 该功能在MyEclipse中是可用的。 一、HTML / JSP编辑器 要编辑HTML或JSP文件,请执行以下操作当中的一…

IPWorks BLE 2022 .NET Edition 22.0.8 Crack

IPWorks BLE 2022 .NET是一个蓝牙低功耗组件库,提供对 BLE 操作的直接访问。IPWorks BLE 组件提供简单的服务发现和对支持 BLE 的设备的访问。 蓝牙库 低功耗蓝牙组件 IPWorks BLE 包括一组功能强大的组件,用于将低功耗蓝牙通信功能集成到 Web、桌面和移…

Liunx 套接字编程(1)UDP协议的操作且实现一个UDP通信客户端

1.套接字编程 主要讲解的就是如何编写一个网络通信程序 1.网络通信的数据中都会包含一个完整的五元组: sip,sport,dip,dport,protocol(源端IP,源端端口,对端IP,对端端口,协议) 五元组完整的描述了数据从哪来,到哪去&am…

平抑风电波动的电-氢混合储能容量优化配置(matlab代码)

目录 1 主要内容 2 部分程序 3 程序结果 4 程序链接 1 主要内容 该程序部分复现电机文章《平抑风电波动的电-氢混合储能容量优化配置》,针对电-氢混合系统协同平抑接入新型电力系统的新能源波动问题,提出考虑碱性电解槽运行特性的电-氢混合储能容量…

D. Array Restoration(st表 O(1)查询区间最值)

Problem - D - Codeforces 给定一个由n个整数组成的初始数组a,位置从1到n编号。 对该数组执行q次查询,每次查询选择一个区间[li, ri](1≤li≤ri≤n),并将该区间内所有元素的值都改为i。查询的顺序不能更改&#xff0c…

企业多个文件存储系统并行使用,IT人员如何统一高效管理?

文件存储系统在企业内部应用广泛,各个企业使用习惯各不相同。很多企业在业务开展中,由于内部业务结构复杂、部门间文件存储习惯差异化、需要与外部合作伙伴进行数据文件交换等原因,会出现企业内部多个文件存储系统并行使用的情况。 对于IT技术…

IPB60R950C6-ASEMI代理英飞凌高压MOS管IPB60R950C6

编辑:ll IPB60R950C6-ASEMI代理英飞凌高压MOS管IPB60R950C6 型号:IPB60R950C6 品牌:Infineon(英飞凌) 封装:TO-263 最大漏源电流:12A 漏源击穿电压:600V RDS(ON)Max&#xff…

关于全志T113开发板接7寸LCD屏幕显示异常问题的解决方案

在入手全志T113之后,第一时间移植好了之前6ull平台的rootfs。但是在测试QT的过程中发现屏幕最右侧有一部分显示不正常,经过初步推测应该是RGB行场同步时序有问题。本以为在设备树里面稍作修改之后就能OK,但是居然前前后后一共花了至少三个星期…

期刊介绍|骨科老牌期刊,无版面费,审稿极速,毕业不二之选!

今天给大家介绍一本中药方面的期刊:JOURNAL OF ORTHOPAEDIC RESEARCH 一、基本信息 1、期刊名称:JOURNAL OF ORTHOPAEDIC RESEARCH; 2、期刊ISSN: 0736-0266; 3、研究方向:医学-整形外科; 4、出版社&#x…

AI怎么把游戏变好玩?米哈游出手了

《原神》发布两年半后,游戏新贵米哈游终于出新,上线了《崩坏:星穹铁道》。新游戏的一大亮点是内置了一个“图生图”的AIGC工具,用户可上传任何图片,生成对应风格的游戏角色“三月七”。 广大玩家脑洞大开,短短一周时间…

专业的图像编辑软件Affinity Photo 2.04版本在win10系统的下载与安装配置教程

目录 前言一、Affinity Photo安装二、使用配置总结 前言 Affinity Photo 是一款专业的图像编辑软件,提供了很多强大的工具和功能。 一些常用工具的介绍: 选择工具 ——矩形选择工具:用于选择矩形区域。 ——椭圆选择工具:用于选…

Android 网络编程基础

Android 网络编程是一个重要的开发技能,可以让我们的应用程序更加丰富、实用。需要开发者根据实际需求选择合适的网络通信方式,并结合安全协议和数据传输加密算法等措施,以保证数据传输的安全性和可靠性。 网络协议 在 Android 网络编程中&a…

虚拟环境中的 CPU 优化技巧

近年来,虚拟化已成为管理计算资源的主流方式,使用户能够在一台机器上运行多个操作系统和应用程序。虚拟化虽然带来了许多好处,例如更好的资源利用和更大的灵活性,但在优化CPU性能方面也带来了挑战。 在本文中,我们将探…

系统分析师:五、系统配置与性能评价

目录 一、性能指标 二、阿姆达尔解决方案 三、性能评价方法 一、性能指标 性能指标总体如下: 主频:也称时钟频率,主频越高,意味着CPU工作速度越快。它的倒数就是时钟周期。 CPI:每条指令执行锁需要的时钟周期数。 …

那些我收藏多年和偷摸使用的工具~~~

作为一个见到好东西,不管有没有用先收藏的我来说,本期活动实在是太有必要写一篇博客了 目录 展示我的收藏癖生活类收藏学习类收藏工具类收藏谷歌插件类收藏 工具推荐效率工具sublime 文件转换工具text转MarkdownMarkdown-Weixin[Cmd Markdown 编辑阅读器…

算法篇——动态规划大集合(js版)

509. 斐波那契数 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) 0,F(1) 1 F(n) F(n - 1) F(n - 2),其中 n…

计算机毕业论文选题推荐|软件工程|系列六

文章目录 导文题目导文 计算机毕业论文选题推荐|软件工程 (***语言)==使用其他任何编程语言 例如:基于(***语言)门窗账务管理系统的设计与实现 得到:基于JAVA门窗账务管理系统的设计与实现 基于vue门窗账务管理系统的设计与实现 等等 题目 基于(***语言)的研发部署管理…

正视架构设计的重要作用

要讨论软件架构设计在软件开发中的重要作用,首先让我们来了解一下目前国内软件的开发现状。   总的来说,国内的多数企业仍然是采用“瀑布模型”作为软件开发过程的主要模型。虽然在采用瀑布模型的同时可能会引入原型法以及诸如MSF等其它软件开发方法与…

必须要掌握的音视频编码、解码基础!

一、音视频为什么要编码? 音视频编码技术在音视频领域有着举足轻重的地位,这是由于音视频原始数据量较大,在传输的过程中如果不进行编码的话,则无法进行传输。比方说,一张普通的图片的大小大概是1-2M,假设我…