自定义异步线程服务

异步线程池配置:

/*** 启动异步线程-并配置线程池*/
@Configuration
@EnableAsync
public class AsyncConfig {@Bean(name = "taskExecutor")public Executor taskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(2); // 核心线程数executor.setMaxPoolSize(5); // 最大线程数executor.setQueueCapacity(500); // 队列容量executor.setThreadNamePrefix("Async-"); // 线程名称前缀executor.initialize();return executor;}
}

异步线程服务


/*** 异步线程服务** @author Lance* @since 2024-07-11 10:07*/
@Component
public class AsyncTaskService {private static final Logger logger = LoggerFactory.getLogger(AsyncTaskService.class);// 默认最大重试次数private static final int DEFAULT_MAX_ATTEMPTS = 3;// 默认重试间隔时间private static final long DEFAULT_DELAY_BETWEEN_ATTEMPTS = 1000;/*** 启动一个异步任务,并使用重试机制** @param task 待执行的任务* @param <T>  类型* @return 返回结果*/@Asyncpublic <T> CompletableFuture<T> executeAsyncTaskWithRetry(Callable<T> task) {return executeAsyncTaskWithRetry(task, DEFAULT_MAX_ATTEMPTS, DEFAULT_DELAY_BETWEEN_ATTEMPTS);}/*** 启动一个异步任务,并使用重试机制** @param task         待执行的任务* @param maxAttempts  最大重试次数* @param initialDelay 重试间隔时间* @param <T>          类型* @return 返回结果*/@Asyncpublic <T> CompletableFuture<T> executeAsyncTaskWithRetry(Callable<T> task, int maxAttempts, long initialDelay) {CompletableFuture<T> future = new CompletableFuture<>();ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);executeTaskWithRetry(task, maxAttempts, initialDelay, future, scheduler, 0, new ArrayList<>());return future;}private <T> void executeTaskWithRetry(Callable<T> task, int maxAttempts, long initialDelay, CompletableFuture<T> future, ScheduledExecutorService scheduler, int attempt, List<Exception> exceptions) {if (attempt >= maxAttempts) {RuntimeException exception = new RuntimeException("任务失败,已达最大重试次数: " + maxAttempts);exceptions.forEach(exception::addSuppressed);future.completeExceptionally(exception);scheduler.shutdown();logger.error("任务失败,已达最大重试次数: {}", maxAttempts, exception); // 添加这行来打印错误信息return;}CompletableFuture<T> attemptFuture = CompletableFuture.supplyAsync(() -> {try {return task.call();} catch (Exception e) {throw new CompletionException(e);}});attemptFuture.whenComplete((result, throwable) -> {if (throwable == null) {future.complete(result);scheduler.shutdown();} else {// 指数退避策略来计算重试间隔 延迟时间是初始延迟initialDelay乘以2的attempt次方long delay = (long) (initialDelay * Math.pow(2, attempt));logger.info("任务失败,将在 {} 毫秒后重试,尝试第:{} 次", delay, attempt + 1);exceptions.add((Exception) throwable.getCause());scheduler.schedule(() -> executeTaskWithRetry(task, maxAttempts, initialDelay, future, scheduler, attempt + 1, exceptions), delay, TimeUnit.MILLISECONDS);}});}/*** 启动一个无返回的异步任务** @param task 待执行的任务*/@Asyncpublic void executeAsyncRunnableTask(Runnable task) {task.run();}
}

执行测试:


@RestController
public class AsyncController {@Resourceprivate AsyncTaskService genericAsyncService;@GetMapping("/startAsyncTask")@ApiOperation("执行异步任务")public String startAsyncTask() {genericAsyncService.executeAsyncTaskWithRetry(() -> {System.out.println("执行异步任务: " + Thread.currentThread().getName());Thread.sleep(5000); // 模拟长时间运行的任务System.out.println("异步任务完成: " + Thread.currentThread().getName());return "任务结果";});return "异步任务已启动";}@GetMapping("/startAsyncRunnableTask")@ApiOperation("不需要返回值的操作的任务")public String startAsyncRunnableTask() {genericAsyncService.executeAsyncRunnableTask(() -> {System.out.println("执行异步Runnable任务: " + Thread.currentThread().getName());// 执行一些不需要返回值的操作// 例如,发送电子邮件、更新数据库、日志记录等System.out.println("异步Runnable任务完成: " + Thread.currentThread().getName());});return "异步Runnable任务已启动";}private static final Random RANDOM = new Random();@GetMapping("/executeTask")@ApiOperation("执行异步任务[重试]")public ResponseEntity<CompletableFuture<String>> executeTask() {// 创建一个Callable任务Callable<String> myTask = () -> {// 随机生成一个0到9之间的数字int randomNumber = RANDOM.nextInt(10);System.out.println("我是任务 ====== 随机数" + randomNumber);// 如果随机数小于5,则抛出异常,模拟任务失败if (randomNumber < 5) {System.out.println("随机数: " + randomNumber + ",任务将失败。");throw new Exception("随机失败");}return "Task executed successfully";};// 调用executeAsyncTaskWithRetry方法CompletableFuture<String> resultFuture = genericAsyncService.executeAsyncTaskWithRetry(myTask);// 返回CompletableFuture作为响应return new ResponseEntity<>(resultFuture, HttpStatus.OK);}}

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

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

相关文章

玩转springboot之SpringBoot单元测试

SpringBoot单元测试 spring单元测试 之前在spring项目中使用单元测试时是使用注解RunWith(SpringJUnit4ClassRunner.class)来进行的 RunWith(SpringJUnit4ClassRunner.class)// 通过自动织入从应用程序上下文向测试本身注入beanWebAppConfiguration // 指定web环境ContextConfi…

电商出海第一步,云手机或成重要因素

电商出海第一步并非易事&#xff0c;挑战和机遇并存&#xff0c;出海企业或个人或将借助云手机从而达成商业部署全球化的目的&#xff1b; 下面我们从网络稳定、数据安全、成本、以及多平台适配方面来看&#xff0c;究竟为什么说云手机会成为出海的重要因素&#xff1b; 首先…

新手前端系列入门-什么是前端开发

一、什么是前端 前端&#xff0c;也称为前端开发或客户端开发&#xff0c;一般是指在构建网站或Web应用程序时&#xff0c;与用户直接交互的部分。就是指那些我们在网页上能看到、能直接跟用户打交道的部分。 简单来说&#xff0c;就是你打开一个网站&#xff0c;能看到的所有…

西门子大手笔又买一家公司,2024年“两买”和“两卖”的背后……

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 更多的海量【智能制造】相关资料&#xff0c;请到智能制造online知识星球自行下载。 今年&#xff0c;这家全球工业巨头不仅精准出击&#xff0c…

第4章 引擎提供的着色器工具函数和数据结构

4.1 UnityShaderVariables.cginc文件中的着色器常量和函数 4.1.1 进行变换操作用的矩阵 1.判断USING DIRECTIONAL LIGTH宏是否定义并分析与立体渲染相关的宏 立体多例化渲染技术的核心思想是一次向渲染管道上提交两份待渲染的几何体数据&#xff0c;减少绘制调用&#xff08;d…

【信创国产化】Nacos 2.3.2连接达梦数据库

JeecgBoot 目前提供的nacos版本号 2.3.2已经支持与达梦数据库对接。 jeecg-boot/jeecg-server-cloud/jeecg-cloud-nacos项目默认加入了达梦驱动和yml配置。如果你是老代码&#xff0c;可以参考下面的步骤手工集成 项目地址&#xff1a;https://github.com/jeecgboot/JeecgBoot…

Anaconda 安装与基本使用总结

最近需要在服务器上安装和使用aconada&#xff0c;发现之前总是在网上找教程&#xff0c;每次都要找&#xff0c;很麻烦。这次就自己写一个安装笔记。以备日后使用。 1.服务器系统版本 ubuntu22.04 2. 软件安装 aconda软件的安装可以下面的教程&#xff08;实测有效&#xf…

斐波那契查找算法

斐波那契查找原理&#xff0c;仅仅改变了中间结点(mid)的位置&#xff0c;mid不再是中间或插值得到,而是位于黄金分割点附近&#xff0c;即midlowF(k-1)-1(F代表斐波那契数列) F[k]F[k-1]F[k-2],>(F[k]-1) (F[k-1]-1)(F[k-2]-1)1 说明:只要顺序表的长度为F[k]-1,则可以将该…

arm64架构kvm情景分析 - type1型和type2型虚拟机管理器

内核版本&#xff1a;linux-v5.9 架构&#xff1a;arm64 1 type1型和type2虚拟机管理器 在arm64架构中&#xff0c;共有EL3到EL0四个异常级别&#xff0c;EL3异常级别最高。通常操作系统&#xff08;如linux&#xff09;运行在EL1&#xff0c;应用程序运行在EL0&#xff0c;EL…

Apache中使用CGI

Apache24 使用Visual Studio 2022 // CGI2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include <stdio.h> #include <stdlib.h>#include <stdio.h>void main() {//设置HTML语言printf("Content-type:text/html\n\n&q…

柯桥外语学校【韩语干货】“-고 있다” VS “-아/어/여 있다”

01 相同点 都可以用于动词之后&#xff0c;且形式有相似之处。 &#xff08;1&#xff09;민호 씨는 전화를 하고 있습니다. 敏镐正在打电话。 &#xff08;2&#xff09;황민 씨는 영어를 공부하고 있습니다. 黄珉正在学习英语。 &#xff08;3&#xff09;그 사람이 문 …

06_Shell内置命令

06_Shell内置命令 一、如何判断是否内置命令 使用type命令可以区分命令种类 二、alias #!/bin/bash#设置别名 psef alias psef"ps -ef | grep java"#删除别名 psef unalias psef#删除所有别名 unalias -a以上设置都是临时性的&#xff0c;真正永久设置&#xff0c;…

“离职员工”试图打包资料带走,如何防止敏感数据外泄?

2010年5月间&#xff0c;某家电巨头四名前职工非法泄露该家电洗衣机重要生产和采购环节数据&#xff0c;给家电集团造成直接经济损失共计2952.35万元。 2017年1月&#xff0c;某科技巨头消费者终端业务6名员工&#xff0c;离职后拿着该企业终端的知识产权结果赚钱&#xff0c;最…

Flask和Django两个Web框架的特点和适用场景

Flask与Django是两个非常流行的Python Web框架&#xff0c;它们各有独特的特点和适用场景。下面将从不同方面对这两个框架进行比较。 一、特点比较 1. 轻量级与全功能 Flask&#xff1a; 轻量级&#xff1a;Flask是一个微框架&#xff0c;代码量少&#xff0c;灵活性高&…

【系统架构设计师】九、软件工程(软件测试)

目录 八、软件测试 8.1 测试分类 8.2 静态方法 8.2.1 静态测试 8.2.2 动态测试 8.2.3 自动化测试 8.3 测试阶段 8.3.1 单元测试 8.3.2 集成测试 8.3.3 确认测试 8.3.4 系统测试 8.3.5 性能测试 8.3.6 验收测试 8.3.7 其他测试 8.4 测试用例设计 8.4.1 黑…

编程视频用什么软件好看:探索最佳编程教学工具

编程视频用什么软件好看&#xff1a;探索最佳编程教学工具 在数字化时代&#xff0c;编程技能已成为一项不可或缺的核心竞争力。然而&#xff0c;对于初学者来说&#xff0c;如何有效地学习编程却是一个令人困惑的问题。观看编程视频成为了一种流行的学习方式&#xff0c;但如…

Spring-Data-ES-template工具类使用

SpringDataElasticsearch 提供了一个工具类 ElasticsearchTemplate&#xff0c;我们使用该类对象也可以对 ES 进行操作 1.操作索引 首先注入操作ES所需要的工具类(ElasticsearchTemplate)。 Autowiredprivate ElasticsearchTemplate template; 将createIndex改为false Docu…

springboot在线教育平台-计算机毕业设计源码68562

摘要 在数字化时代&#xff0c;随着信息技术的飞速发展&#xff0c;在线教育已成为教育领域的重要趋势。为了满足广大学习者对于灵活、高效学习方式的需求&#xff0c;基于Spring Boot的在线教育平台应运而生。Spring Boot以其快速开发、简便部署以及良好的可扩展性&#xff0c…

N6 word2vec文本分类

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊# 前言 前言 上周学习了训练word2vec模型&#xff0c;这周进行相关实战 1. 导入所需库和设备配置 import torch import torch.nn as nn import torchvision …

【启明智显分享】乐鑫HMI方案4.3寸触摸串口屏:水质检测仪应用解决方案

水是万物的源泉&#xff0c;了解水的酸碱度对于保障我们的健康、生产和生活环境至关重要。水质检测仪应运而生&#xff0c;它让我们能够洞察水的酸碱奥秘。 水是万物的源泉&#xff0c;了解水的酸碱度对于保障我们的健康、生产和生活环境至关重要。水质检测仪应运而生&#xff…