• Spring Boot使用 @Async 注解进行异步调用


    Spring Boot使用 @Async 注解进行异步调用

    创建异步调用线程池配置代码:

    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.scheduling.annotation.AsyncConfigurer;
    import org.springframework.scheduling.annotation.EnableAsync;
    import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
    
    import java.util.concurrent.Executor;
    import java.util.concurrent.ThreadPoolExecutor;
    
    @Configuration
    @EnableAsync // 启用异步调用
    public class AsyncConfig implements AsyncConfigurer {
    
    
        @Bean("taskExecutor")
        public Executor getCutChartExecutor() {
            //线程池
            ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
            taskExecutor.setCorePoolSize(3);
            taskExecutor.setMaxPoolSize(10);
            taskExecutor.setQueueCapacity(100);
            taskExecutor.setKeepAliveSeconds(60);
            taskExecutor.setThreadNamePrefix("async-task-thread-pool");
            //rejection-policy:当pool已经达到max size的时候,如何处理新任务
            //CALLER_RUNS:不在新线程中执行任务,而是由调用者所在的线程来执行
            //对拒绝task的处理策略
            taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
            taskExecutor.initialize();
            return taskExecutor;
        }
    
    }

    创建异步调用方法:

    import lombok.extern.slf4j.Slf4j;
    import org.springframework.scheduling.annotation.Async;
    import org.springframework.stereotype.Component;
    
    @Slf4j
    @Component
    public class AsyncExecutor {
    
        @Async("taskExecutor")
        public void execute(Runnable runnable){
            try {
                Thread thread = Thread.currentThread();
                log.info("当前异步线程:{}", thread.getName());
                runnable.run();
            } catch (Exception e) {
                log.error("AsyncExecutor execute执行异常",e);
            }
        }
    }

    调用异步方法:

        @RequestMapping("/async")
        public Future<String> async() {
            System.out.println("start");
            asyncExecutor.execute(() -> {
                System.out.println("async start");
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("async end");
            });
            System.out.println("end");
            return new AsyncResult<>("我是返回值");
        }

    执行结果:

  • 相关阅读:
    自己写的asp日历控件
    处处留心皆学问
    模块化闲谈
    原理……
    DIV和SPAN的区别
    javascript学习感触
    CSS 匹配顺序
    配置闲谈
    找到的一个读取shape数据的代码
    问题和收获
  • 原文地址:https://www.cnblogs.com/tangshengwei/p/15001793.html
Copyright © 2020-2023  润新知