zoukankan      html  css  js  c++  java
  • 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<>("我是返回值");
        }

    执行结果:

  • 相关阅读:
    chrome书签插件
    Js箭头函数和lambda
    CSS水平或垂直居中技巧
    前端需要注意的SEO优化
    OpenCV图像识别初探-50行代码教机器玩2D游戏
    机器学习笔记(十一)----降维
    基于Docker搭建分布式消息队列Kafka
    一个经典面试题:如何保证缓存与数据库的双写一致性?
    Flask 蓝图机制及应用
    软件开发团队如何管理琐碎、突发性任务
  • 原文地址:https://www.cnblogs.com/tangshengwei/p/15001793.html
Copyright © 2011-2022 走看看