首页 > 其他分享 >SpringBoot使用Async注解实现异步线程

SpringBoot使用Async注解实现异步线程

时间:2023-12-15 19:33:55浏览次数:34  
标签:info SpringBoot import executor 线程 org Async log

1、启动类增加@EnableAsync注解

2、yml增加配置

spring:
  task:
    execution:
      pool:
        max-size: 8
        core-size: 8
        keep-alive: 60
        queue-capacity: 1000
      thread-name-prefix: Asnyc-task-calc-

3、编写配置类AsyncTaskConfig

import lombok.extern.slf4j.Slf4j;
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.concurrent.Executor;


@Configuration
@Slf4j
public class AsyncTaskConfig implements AsyncConfigurer {

    @Value("${spring.task.execution.pool.max-size}")
    private Integer maxSize;

    @Value("${spring.task.execution.pool.core-size}")
    private Integer coreSize;

    @Value("${spring.task.execution.pool.keep-alive}")
    private Integer keepAlive;

    @Value("${spring.task.execution.pool.queue-capacity}")
    private Integer queueCapacity;

    @Value("${spring.task.execution.thread-name-prefix}")
    private String threadNamePrefix;

    @Bean("myAsync")
    public Executor asyncExecutor(){
        log.info("线程池加载--开始");
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        // 核心线程池大小
        executor.setCorePoolSize(coreSize);
        // 最大线程数
        executor.setMaxPoolSize(maxSize);
        // 活跃时间
        executor.setKeepAliveSeconds(keepAlive);
        // 队列容量
        executor.setQueueCapacity(queueCapacity);
        // 线程名字前缀,设置前缀 自定义的Bean名称则失效
        executor.setThreadNamePrefix(threadNamePrefix);
        // 主线程等待子线程执行时间
        //executor.setAwaitTerminationSeconds(10);
        executor.initialize();
        log.info("线程池加载--完毕");
        return  executor;
    }

    /**
     * 只能捕获无返回值的异步方法,有返回值的被主线程处理
     * @param
     * @return org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler
     * @throws
     */
    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return new CustomAsyncExceptionHandler();
    }

    /**
     * @description:  处理异步方法中未捕获的异常
     * @return
     */
    class CustomAsyncExceptionHandler implements AsyncUncaughtExceptionHandler {
        @Override
        public void handleUncaughtException(Throwable throwable, Method method, Object... obj) {
            log.info("Exception message - {}", throwable.getMessage());
            log.info("Method name - {}", method.getName());
            log.info("Parameter values - {}", Arrays.toString(obj));
            if (throwable instanceof Exception) {
                Exception exception = (Exception) throwable;
                log.info("exception:{}", exception.getMessage());
            }
            throwable.printStackTrace();
        }
    }
}

4、单独编写异步任务类

@Component
@Slf4j
public class AsyncTask {

    @Async("myAsync")
    public void sendMsg(){
        log.info("异步发送短信-开始:当前线程={}",Thread.currentThread().getName());
        for (int i=0;i<20;i++){
            try {
                Thread.sleep(1000L);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            log.info("正在发送第{}条短信,线程:{}",i+1,Thread.currentThread().getName());
        }
        log.info("异步发送短信-结束:当前线程={}",Thread.currentThread().getName());
    }
}

5、其他service调用异步任务即可

 

标签:info,SpringBoot,import,executor,线程,org,Async,log
From: https://www.cnblogs.com/guliang/p/17904067.html

相关文章

  • Python多线程编程:竞争问题的解析与应对策略
    本文将深入探讨Python多线程编程中可能出现的竞争问题、问题根源以及解决策略,旨在帮助读者更好地理解、应对并发编程中的挑战。多线程竞争问题的复杂性源自于对共享资源的并发访问和操作。在不同线程间的交叉执行中,共享资源可能因无序访问而导致数据不一致、死锁或饥饿等问题。解决......
  • “System.Net.Http.HttpContent”不包含“ReadAsAsync”的定义
    WebApi当道的今天,之前要自己写的序列化,现在有人都做好了publicclassPostHelper{staticHttpClientclient=newHttpClient();publicstaticasyncTask<T>PostTestAsync<T>(stringurl,Targs){//stringjson=JsonS......
  • SpringBoot启动
    springBoot启动全流程如下所示:框架初始化,完成相关配置:publicSpringApplication(ResourceLoaderresourceLoader,Class<?>...primarySources){this.resourceLoader=resourceLoader;Assert.notNull(primarySources,"PrimarySourcesmustnotbenull&quo......
  • Java核心知识体系8:Java如何保证线程安全性
    Java核心知识体系1:泛型机制详解Java核心知识体系2:注解机制详解Java核心知识体系3:异常机制详解Java核心知识体系4:AOP原理和切面应用Java核心知识体系5:反射机制详解Java核心知识体系6:集合框架详解Java核心知识体系7:线程不安全分析1Java内存模型(JMM)如何解决并发问题维度1:使......
  • springcloudalibabada搭建过程中springboot启动卡住起不来 (Started MoonceProviderApp
    如下图一样springcloudAlibaba在创建新模块之后启动新模块没有注册到nacos上,而是直接卡住起不来原因 原因是:引入了错误的web包: 解决办法:引入相应的 spring-boot-starter-web包:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot......
  • Java-创建线程池的参数及工作原理
    Java-创建线程池的参数及工作原理常见的参数corePoolSize(核心线程数):线程池中保持的最小线程数,即使它们是空闲的。maximumPoolSize(最大线程数):线程池中允许的最大线程数。keepAliveTime(线程空闲时间):当线程池中的线程数超过核心线程数时,多余的空闲线程在被终止之前等待新......
  • Java-创建线程池的参数及工作原理
    Java-创建线程池的参数及工作原理常见的参数corePoolSize(核心线程数):线程池中保持的最小线程数,即使它们是空闲的。maximumPoolSize(最大线程数):线程池中允许的最大线程数。keepAliveTime(线程空闲时间):当线程池中的线程数超过核心线程数时,多余的空闲线程在被终止之前等待新......
  • Java-创建线程池的参数及工作原理
    Java-创建线程池的参数及工作原理常见的参数corePoolSize(核心线程数):线程池中保持的最小线程数,即使它们是空闲的。maximumPoolSize(最大线程数):线程池中允许的最大线程数。keepAliveTime(线程空闲时间):当线程池中的线程数超过核心线程数时,多余的空闲线程在被终止之前等待新......
  • 两个线程共享一个套接字,其中一个线程使用sendmsg函数不断发送消息到该套接字,另一个线
    以下是使用C语言写的一段代码,实现两个线程共享一个套接字,其中一个线程使用sendmsg函数不断发送消息到该套接字,另一个线程使用recvmsg函数不断接收该套接字的消息,并打印出来的功能点击查看代码#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.......
  • 08-asyncio -- 异步IO
    写在前面async--异步io---IOasyncio--异步IO1.Python协程介绍协程,又称之为微线程,本质上还是python运行的单进程单线程程序。和线程不同,协程不涉及到系统级的上下文切换,而是在单个线程内进行锁执行代码块的切换。因此协程并没有提高计算速度,而是在代码执行的等待时......