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

SpringBoot使用@Async注解,实现异步任务

1.直接在方法上加@Async注解,标明为异步任务:

@Component
public class MyAsyncTask {@Asyncpublic void asyncImportTask(String jsonList){//...具体业务逻辑//从redis缓存中查询数据(使用若依框架自带的redis方法)Data redisData = RedisUtils.getCacheObject(DataEnum.NUMONE.getValue());if(ObjectUtil.isEmpty(redisData)){//将数据查询后存入redis缓存1HRedisUtils.setCacheObject(DataEnum.NUMONE.getValue(), Data, Duration.ofHours(1));}}
}

2.设置默认的Async的线程,且开启异步配置,即配置上@EnableAsync注解:

@EnableAsync(proxyTargetClass = true)
@Configuration
public class AsyncConfig extends AsyncConfigurerSupport {@Autowired@Qualifier("scheduledExecutorService")private ScheduledExecutorService scheduledExecutorService;/*** 自定义 @Async 注解使用系统线程池*/@Overridepublic Executor getAsyncExecutor() {return scheduledExecutorService;}/*** 异步执行异常处理*/@Overridepublic AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {return (throwable, method, objects) -> {throwable.printStackTrace();StringBuilder sb = new StringBuilder();sb.append("Exception message - ").append(throwable.getMessage()).append(", Method name - ").append(method.getName());if (ArrayUtil.isNotEmpty(objects)) {sb.append(", Parameter value - ").append(Arrays.toString(objects));}throw new ServiceException(sb.toString());};}
}

3.使用的线程池相关配置:

//线程池配置
@Configuration
public class ThreadPoolConfig {/*** 核心线程数 = cpu 核心数 + 1*/private final int core = Runtime.getRuntime().availableProcessors() + 1;@Autowiredprivate ThreadPoolProperties threadPoolProperties;@Bean(name = "threadPoolTaskExecutor")@ConditionalOnProperty(prefix = "thread-pool", name = "enabled", havingValue = "true")public ThreadPoolTaskExecutor threadPoolTaskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(core);executor.setMaxPoolSize(core * 2);executor.setQueueCapacity(threadPoolProperties.getQueueCapacity());executor.setKeepAliveSeconds(threadPoolProperties.getKeepAliveSeconds());executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());return executor;}/*** 执行周期性或定时任务*/@Bean(name = "scheduledExecutorService")protected ScheduledExecutorService scheduledExecutorService() {return new ScheduledThreadPoolExecutor(core,new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build(),new ThreadPoolExecutor.CallerRunsPolicy()) {@Overrideprotected void afterExecute(Runnable r, Throwable t) {super.afterExecute(r, t);Threads.printException(r, t);}};}
}

4.线程池配置属性

//线程池配置属性
@Data
@Component
@ConfigurationProperties(prefix = "thread-pool")
public class ThreadPoolProperties {/*** 是否开启线程池*/private boolean enabled;/*** 队列最大长度*/private int queueCapacity;/*** 线程池维护线程所允许的空闲时间*/private int keepAliveSeconds;}

5.系统全局线程池配置

# 全局线程池相关配置
thread-pool:# 是否开启线程池enabled: true# 队列最大长度queueCapacity: 256# 线程池维护线程所允许的空闲时间keepAliveSeconds: 300

注意:调用被@Async注解的方法时,调用方法不能与被调用方法放在同一类中,否则注解不生效

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 硬件工程师笔试面试——无线通讯模块
  • Go并发编程的高级技巧——请求复制与限流
  • 数据结构之二叉树的暴力删除
  • Golang | Leetcode Golang题解之第415题字符串相加
  • 直播音频解决方案
  • 牛客周赛 Round 60(思维、逆元、组合数、概率DP)
  • Java 入门指南:JVM(Java虚拟机)—— Java 类加载器详解
  • 【iOS】单例模式
  • 基于python+django+vue的图书管理系统
  • 传输层协议 —— TCP协议(上篇)
  • 学习Java(一)类和对象
  • 安卓开发,如何实现apk的代码混淆、日志混淆?
  • 音视频入门基础:AAC专题(10)——FFmpeg源码中计算AAC裸流每个packet的pts、dts、pts_time、dts_time的实现
  • 【d46】【Java】【力扣】234.回文链表
  • 详解QT元对象系统用法
  • php的引用
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 【刷算法】求1+2+3+...+n
  • 2017-09-12 前端日报
  • AHK 中 = 和 == 等比较运算符的用法
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • Django 博客开发教程 8 - 博客文章详情页
  • Java|序列化异常StreamCorruptedException的解决方法
  • Linux快速复制或删除大量小文件
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • vue-router 实现分析
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 大整数乘法-表格法
  • 高程读书笔记 第六章 面向对象程序设计
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • 栈实现走出迷宫(C++)
  • 中文输入法与React文本输入框的问题与解决方案
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • ​VRRP 虚拟路由冗余协议(华为)
  • ​力扣解法汇总946-验证栈序列
  • ‌JavaScript 数据类型转换
  • # 数仓建模:如何构建主题宽表模型?
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • %@ page import=%的用法
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (24)(24.1) FPV和仿真的机载OSD(三)
  • (27)4.8 习题课
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (Java)【深基9.例1】选举学生会
  • (二)学习JVM —— 垃圾回收机制
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (十三)Maven插件解析运行机制
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (原)本想说脏话,奈何已放下
  • (转)关于多人操作数据的处理策略
  • (自用)仿写程序
  • ******之网络***——物理***
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞