【SpringBoot】21 @Async异步任务线程池的隔离

Git仓库

https://gitee.com/Lin_DH/system

介绍

线程池隔离:指一种通过为每个服务提供独立的线程池来隔离服务之间的资源和执行环境的做法。
为什么需要线程池隔离?

  • 资源隔离,每个服务都有独立的线程池,可以避免由于某个服务的异常或高负载导致整个系统的线程资源耗尽。
  • 性能隔离,通过线程池隔离,可以更好地控制每个服务的并发度和资源利用率,提高系统的性能和稳定性。
  • 故障隔离,当一个服务发生故障时,独立的线程池可以使故障不会传播到其他服务,从而增强系统的容错性。
    实现线程池隔离的方式
  • 使用线程池,为每个服务或功能模块创建独立的线程池。
  • 使用线程池隔离框架,如 Hystrix、Resilence4j 等容错框架,可以轻松实现线程池隔离以及其他容错机制。

实现代码

第一步:初始化多个线程池

TaskPoolConfig.java

package com.lm.system.config;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 DUHAOLIN* @date 2024/10/17*/
@EnableAsync
@Configuration
public class TaskPoolConfig {@Beanpublic Executor taskExecutor1() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(2);executor.setMaxPoolSize(2);executor.setQueueCapacity(10);executor.setKeepAliveSeconds(60);executor.setThreadNamePrefix("executor-1-");executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());return executor;}@Beanpublic Executor taskExecutor2() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(2);executor.setMaxPoolSize(2);executor.setQueueCapacity(10);executor.setKeepAliveSeconds(60);executor.setThreadNamePrefix("executor-2-");executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());return executor;}}

第二步:创建异步回调任务,并指定要使用的线程池

AsyncCallBackTask_1.java

package com.lm.system.task;import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;import java.util.Random;
import java.util.concurrent.CompletableFuture;/*** 异步回调* @author DUHAOLIN* @date 2024/10/17*/
@Slf4j
@Component
public class AsyncCallBackTask_1 {public static Random random = new Random();@Async("taskExecutor1")public CompletableFuture<String> one(String taskNo) throws InterruptedException {log.info("开始执行任务:{}", taskNo);long startTime = System.currentTimeMillis();Thread.sleep(random.nextInt(10000));long endTime = System.currentTimeMillis();log.info("完成任务:{},耗时:{} 毫秒", taskNo, endTime - startTime);return CompletableFuture.completedFuture("任务执行完成");}@Async("taskExecutor2")public CompletableFuture<String> two(String taskNo) throws InterruptedException {log.info("开始执行任务:{}", taskNo);long startTime = System.currentTimeMillis();Thread.sleep(random.nextInt(10000));long endTime = System.currentTimeMillis();log.info("完成任务:{},耗时:{} 毫秒", taskNo, endTime - startTime);return CompletableFuture.completedFuture("任务执行完成");}}

第三步:测试类添加测试方法

SystemApplicationTests.java

@Slf4j
@SpringBootTest(classes = SystemApplication.class)
class SystemApplicationTests {@Resourceprivate AsyncCallBackTask_1 asyncCallBackTask_1;@Testpublic void asyncTaskPoolIsolation() throws InterruptedException { //测试线程池隔离long startTime = System.currentTimeMillis();//线程池1CompletableFuture<String> task_1 = asyncCallBackTask_1.one("task_1");CompletableFuture<String> task_2 = asyncCallBackTask_1.one("task_2");CompletableFuture<String> task_3 = asyncCallBackTask_1.one("task_3");//线程池2CompletableFuture<String> task_4 = asyncCallBackTask_1.two("task_4");CompletableFuture<String> task_5 = asyncCallBackTask_1.two("task_5");CompletableFuture<String> task_6 = asyncCallBackTask_1.two("task_6");CompletableFuture.allOf(task_1, task_2, task_3, task_4, task_5, task_6).join();long endTime = System.currentTimeMillis();log.info("任务执行完成,总耗时:" + (endTime - startTime) + "毫秒");}}

效果图

执行测试类 asyncTaskPoolIsolation 方法,得到如下结果:因为配置的初始化线程为2,taskExecutor1 会先执行 one 方法的前两个(图中的 task_2、task_1),task_3 进入缓存队列,等待前两个任务中的一个执行完就可以执行;taskExecutor2 也会先执行 two 方法的前两个(图中的 task_5、task_4),task_6 进入缓存队列,等待前两个任务中的一个执行完就可以执行。

项目结构图

在这里插入图片描述

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

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

相关文章

Python进行GRPC和Dubbo协议的高级测试

在微服务架构日益流行的今天&#xff0c;分布式系统的复杂性不断增加。GRPC 和 Dubbo 协议作为当今互联网行业中常见的高性能通信协议&#xff0c;已经成为服务之间交互的核心。然而&#xff0c;随着服务调用层次的不断增加&#xff0c;如何有效地测试这两种协议&#xff0c;确…

【启明智显分享】5G CPE为什么适合应用在连锁店中?

连锁门店需要5G CPE来满足其日益增长的网络需求&#xff0c;提升整体运营效率和竞争力。那么为什么5G CPE适合连锁店应用呢&#xff0c;小编为此做了整理&#xff0c;主要是基于以下几个方面的原因&#xff1a; 一、高效稳定的网络连接 1、高速数据传输&#xff1a; 5G CPE能…

私域运营流程框架

蝴蝶模型的作用主要体现在以下几点&#xff1a; 1. 提供清晰的运营思路&#xff1a;使运营人员能够全面、系统地规划和执行私域运营策略&#xff0c;避免盲目和混乱。 2. 实现精准营销&#xff1a;通过分层分类&#xff0c;能够针对不同用户群体制定个性化的营销策略&#xff0…

Python中的面向对象编程,类,对象,封装,继承,多态

一、面向对象编程 1.面向过程和面向对象 面向过程和面向对象都是一种编程方式&#xff0c;只不过再设计上有区别。 面向过程 C语言 细分成每一个过程 优点&#xff1a;简单直观、性能高效、代码简洁。 缺点&#xff1a;不易维护、不易扩展、代码重用性低。 面向对象 p…

【MongoDB】MongoDB的集群,部署架构,OptLog,集群优化等详解

文章目录 一、引入复制集的原因二、复制集成员&#xff08;一&#xff09;基本成员&#xff08;二&#xff09;主节点&#xff08;Primary&#xff09;细化成员 三、复制集常见部署架构&#xff08;一&#xff09;基础三节点&#xff08;二&#xff09;跨数据中心 四、复制集保…

万字长文串烧LLM大模型技术原理

导读 导读对Llama 3大型语言模型技术的一次全面概述&#xff0c;涵盖了预训练、后训练及推理阶段的关键技术&#xff0c;包括数据处理、量化方法&#xff08;如INT8和FP8量化&#xff09;、以及如何通过微调提升模型效率和准确性等方面的内容。 0 开始之前 本文从Llama 3报告…

网络工程师--端口隔离技术

端口隔离基本原理&#xff1a; 同一VLAN隔离组内的用户不能进行二次通信 不同隔离组内的用户可正常通信 未划分VLAN隔离的用户也可与VLAN隔离组内的用户正常通信 VLAN隔离组分为两种模式&#xff1a; 二层隔离三层互通 二三层均隔离 命令&#xff1a; 进入要加入隔离组的…

基于SSM花卉商城设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

智慧选矿流程可视化平台

通过图扑可视化搭建的智慧选矿平台为选矿过程提供直观监控与优化方案。实现对生产效率、资源消耗和设备状态的动态分析&#xff0c;优化管理流程&#xff0c;提高矿业生产的智能化水平和决策精准度。

Java程序员从阿里、京东、美团面试回来,这些面试题你会吗?

最近有很多朋友去目前主流的大型互联网公司面试&#xff08;阿里巴巴、京东、美团、滴滴&#xff09;&#xff0c;面试回来之后会发给我一些面试题。有些朋友轻松过关&#xff0c;拿到offer&#xff0c;但是有一些是来询问我答案的。 其实本来真的没打算写这篇文章&#xff0c…

UE5 设置Sequence播完后返回起始位置

UE5 的sequence中&#xff0c;播放完毕&#xff0c;动画会停到最后一帧&#xff0c; 需要播放完毕后&#xff0c;设置sequence为起始位置 蓝图中控制方法&#xff1a; 链接&#xff1a;UE5 设置Sequence播完后返回起始位置 posted by anonymous | blueprintUE | PasteBin F…

德语常用口语学习柯桥小语种学习到泓畅学校,专业外语培训

问候与应答 Guten Morgen!&#xff08;早上好&#xff01;&#xff09;Guten Tag!&#xff08;白天好&#xff01;&#xff09;Guten Abend!&#xff08;晚上好&#xff01;&#xff09;Hallo!&#xff08;你好&#xff01;&#xff09;Wie geht es Ihnen?&#xff08;您好吗&…

破解企业数字化转型之道:数字化?转型?

在当今的商业浪潮中&#xff0c;企业纷纷踏上了数字化转型之路&#xff0c;然而&#xff0c;真正洞悉数字化转型的深层含义者寥寥无几。笔者前面发过一篇文章>>数字化转型&#xff0c;90%都是吹牛&#xff0c;引起热议。文章指出多数企业的数字化转型仅是随波逐流&#x…

HTML学习

一、HTML的基本构成 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>星星(xingxing.com)</title> </head> <body><h1>我的第一个标题</h1><p>我的第一个段落。</p><a h…

为什么人们仍然对云安全感到困惑?

云安全服务商公司的一份报告发现&#xff0c;接受调查的公司中有74%暴露了存储或其他错误配置。这为网络罪犯打开了一扇危险的大门。总的来说&#xff0c;云安全越来越糟糕。安全工具的可用性和质量越来越好&#xff0c;但确认云计算基础设施的人却越来越笨。有些东西必须要放弃…

计算机网络基础(3)_应用层自定义协议与序列化

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 计算机网络基础(3)_应用层自定义协议与序列化 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&a…

前言 --- 《跟着小王学Python》

前言 《跟着小王学Python》 是一套精心设计的Python学习教程&#xff0c;适合各个层次的学习者。本教程从基础语法入手&#xff0c;逐步深入到高级应用&#xff0c;以实例驱动的方式&#xff0c;帮助学习者逐步掌握Python的核心概念。通过开发游戏、构建Web应用、编写网络爬虫、…

【C#设计模式(8)——过滤器模式(Adapter Pattern)】

前言 滤液器模式可以很方便地实现对一个列表中的元素进行过滤的功能&#xff0c;能方便地修改滤器的现实&#xff0c;符合开闭原则。 代码 //过滤接口public interface IFilter{List<RefuseSorting> Filter(List<RefuseSorting> refuseList);}//垃圾分类public cla…

开源共建 | 长安链开发常见问题及规避

长安链开源社区鼓励社区成员参与社区共建&#xff0c;参与形式包括不限于代码贡献、文章撰写、社区答疑等。腾讯云区块链王燕飞在参与长安链测试工作过程中&#xff0c;深入细致地总结了长安链实际开发应用中的常见问题及其有效的规避方法&#xff0c;相关内容多次解答社区成员…

什么是RAG? LangChain的RAG实践!

1. 什么是RAG RAG的概念最先在2020年由Facebook的研究人员在论文《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》中提出来。在这篇论文中他们提出了两种记忆类型&#xff1a; 基于预训练模型&#xff08;当时LLM的概念不像现在这么如日中天&#xff0…