首页 > 其他分享 >ThreadPoolTaskExecutor以及通过注解实现异步任务

ThreadPoolTaskExecutor以及通过注解实现异步任务

时间:2024-02-16 15:12:13浏览次数:31  
标签:异步 asyncTaskExecutor 线程 注解 ThreadPoolTaskExecutor public threadPoolExecutor

ThreadPoolTaskExecutor是Spring框架的线程池,实现方式如下:

 1 //声明一个name为asyncTaskExecutor的线程池bean到容器中
 2 @Bean("asyncTaskExecutor")
 3 public Executor getAsyncExecutor() {
 4     ThreadPoolTaskExecutor threadPoolExecutor = new ThreadPoolTaskExecutor();
 5     //核心线程数
 6     threadPoolExecutor.setCorePoolSize(ThreadPoolConfig.CORE_POOL_SIZE);
 7     //最大线程数量
 8     threadPoolExecutor.setMaxPoolSize(ThreadPoolConfig.MAX_POOL_SIZE);
 9     //等待队列
10     threadPoolExecutor.setQueueCapacity(ThreadPoolConfig.WORK_QUEUE);
11     //线程池名称RVCAsyncTaskPool
12     threadPoolExecutor.setThreadNamePrefix("RVCAsyncTaskPool-");
13     //空闲存活时间
14     threadPoolExecutor.setKeepAliveSeconds(ThreadPoolConfig.KEEP_ALIVE_TIME);
15     //拒绝策略
16     threadPoolExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
17     //装饰器,本项目中主要应用于http请求,所以在自定义装饰器RvcAsyncTaskDecorator中,用于传递httpRequest的header信息
18     threadPoolExecutor.setTaskDecorator(new RvcAsyncTaskDecorator());
19     threadPoolExecutor.initialize();
20     return threadPoolExecutor;
21 }

TaskDecorator:执行回调方法的装饰器,主要应用于传递上下文,或者提供任务的监控/统计信息

RvcAsyncTaskDecorator装饰器为:

 1 public class RvcAsyncTaskDecorator implements TaskDecorator {
 2     @Override
 3     public Runnable decorate(Runnable runnable) {
 4         //headerMap为当前HttpRequest请求的header信息
 5         //RequestContextHolder.getRequestAttributes().getRequest();
 6         Map<String, String> headerMap = HttpHeaderUtils.shareHttpHeader();
 7         return () -> {
 8             try {
 9                 HttpHeaderUtils.setHeaderThreadLocal(headerMap);
10                 runnable.run();
11             } finally {
12                 HttpHeaderUtils.remove();
13             }
14         };
15     }
16 }

实现异步方法的注解的切面RvcAsyncAspect为:

 1 @Component
 2 @Aspect
 3 @RequiredArgsConstructor
 4 @Order(Ordered.HIGHEST_PRECEDENCE)
 5 public class RvcAsyncAspect {
 6     private final Executor asyncTaskExecutor;
 7 
 8     @Around("@annotation(rvc.core.annotation.RvcAsync)")
 9     public void doAround(ProceedingJoinPoint point) {
10         //runAsync无参数返回的异步执行,supplyAsync为有返回值的异步执行
11         CompletableFuture.runAsync(() -> {
12             try {
13                 this.proceed(point);
14             } catch (Exception ex) {
15                 //doSomething
16             }
17         }, asyncTaskExecutor);
18     }
19 
20     @SneakyThrows
21     private void proceed(ProceedingJoinPoint point) {
22         point.proceed();
23     }
24 }

注解RvcAsync为:

1 @Target(ElementType.METHOD)
2 @Retention(RetentionPolicy.RUNTIME)
3 @Documented
4 public @interface RvcAsync {
5 }

 

标签:异步,asyncTaskExecutor,线程,注解,ThreadPoolTaskExecutor,public,threadPoolExecutor
From: https://www.cnblogs.com/zeevy/p/18017172

相关文章

  • 异步调用中链路信息TRACE丢失问题
    1、问题描述链路框架底层为jaegertracing,行内的北斗链路是对这个jaegertracing进行了一层包装框架中使用自定义注解@RvcAsync来执行异步任务,RvcAsync注解核心逻辑为使用CompletableFuture.runAsync()方法执行多线程任务,传入的第二个参数asyncTaskExecutor为自定义线程池。1Co......
  • JSON相关注解的使用
    1.@JsonInclude当使用json进行序列化时,往往会遇到某个实体对象的属性为null,可以使用如下类注解使得属性值为null的时候Java Bean不参与序列化可以作用在类上,也可以作用在字段上@JsonInclude(JsonInclude.Include.NON_NULL)     其他常量值包括:Include.Include.ALWAYS   ......
  • 通过注解实现本地缓存caffeine的学习
    注解源码如下1@Target(ElementType.METHOD)2@Retention(RetensionPolicy.RUNTIME)3@Documented4public@interfaceRvcCache{5Strngkey();6Stringid()defaultStringUtils.EMPTY;7}1@Component2@Aspect3@RequiredArgsConstructor4......
  • C#实现异步编程的常用方式总结
    随着现代软件对性能和响应速度的要求越来越高,异步编程已经成为许多开发者必须掌握的技能。C#提供了多种实现异步编程的方式,每种方式都有其特定的适用场景和优缺点。本文将详细介绍C#中实现异步编程的常用方式,帮助读者更好地理解并选择合适的异步编程方法。一、Task和TaskC#......
  • 【Java 并发】【队列应用】【一】ArrayBlockingQueue 的使用-Logback异步日志打印
    1 前言看了那么多Java提供的队列工具,那么我们这节开始看看哪些地方用到了这些队列哈。这一节我们讲解logback异步日志打印中ArrayBlockingQueue的使用。2  异步日志打印模型概述在高并发、高流量并且响应时间要求比较小的系统中同步打印日志已经满足不了需求了,这是因为......
  • [spring] spring学习笔记(3): 通过注解实现依赖注入
    注解Annotation注解是代码中的一种特殊标记,java中的格式为@Anno_Name(pro=value)注解可以被使用在方法,类和属性上;在spring中,使用注解来实现自动装配,可以简化Bean的配置,基本步骤如下:引入依赖开启组件扫描使用注解定义Bean注入依赖引入依赖在新建的spring项目下的src/main......
  • @RestController和@Controller注解
     @RestController和@Controller是Spring框架中用于定义控制器的两个注解; @RestConteroller注解:@RestController是@Controller的特殊形式,是用于创建RESTfulWeb服务的控制器类,而非传统的Web形式;控制器方法使用@RequstMapping或其他衍生注解来映射url路径,这些数据返回......
  • Spring Boot 集成 Redisson分布式锁(注解版)
    转载自:https://blog.csdn.net/Ascend1977/article/details/131126047        Redisson是一种基于Redis的Java驻留集群的分布式对象和服务库,可以为我们提供丰富的分布式锁和线程安全集合的实现。在SpringBoot应用程序中使用Redisson可以方便地实现分布式应用......
  • JUnit 5 注解总结与解析
    前言大家好,我是chowley,通过前篇的JUnit实践,我对这个框架产生了好奇,除了断言判断,它还有哪些用处呢?下面来总结一下它的常见注解及作用。正文在Java单元测试中,JUnit是一种常用的测试框架,它提供了丰富的注解用于标识测试方法、设置测试环境以及控制测试执行流程。除了用于断言判断之......
  • react引用async异步函数数据渲染
    当需要在React组件中引用异步函数获取的数据时,可以使用useState钩子来存储数据,并在组件渲染时进行处理。下面是一个示例,展示了如何在React中引用异步函数的数据并进行渲染:importReact,{useState,useEffect}from'react';functionMyComponent(){const[data,......