Spring @Async 注解的使用

我的项目目前主要使用这个注解做一些与主流程无关的任务,如注册成功完发送短信,当调用第三方接口出错时发送钉钉消息登等,项目为springboot项目

  • 首先你要配置一个  ThreadPoolTaskExecutor,一个项目中可以有多个ThreadPoolTaskExecutor
        @Bean("asyncTaskExecutor")
        public ThreadPoolTaskExecutor taskExecutor() {
            ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    
            // 核心线程数
            executor.setCorePoolSize(3);
            // 最大线程数
            executor.setMaxPoolSize(20);
            // 队列的深度
            executor.setQueueCapacity(256);
            // 超过改时间线程就被回收
            executor.setKeepAliveSeconds(60);
    
            executor.setThreadNamePrefix("asyncTaskExecutor-");
            // 设置拒绝任务策略,使用当前线程执行本次任务
            executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
            return executor;
        }

    核心线程数队列会影响吞吐量,线程少的话相当于很少的人在干活,自然干的慢一点,吞吐量就低一点,拒绝策略设置为主线程执行任务,当队列满了(有界队列才有这个说法),线程数又等于maxPoolSize,这个时候会执行相应的拒绝策略,默认是拒绝任务抛出一个异常,这里用了主线程执行,毕竟当前任务是不能丢的.

  • 使用注解
@Async 的value 要和 ThreadPoolTaskExecutor bean的名字一样,返回值类型是void,这样就可以异步执行了,快去试试吧
    @Async("asyncTaskExecutor")
    @Override
    public void sendDingTalkTextMsgExecutor(BooleanDataThreeElementsDTO dto) {
    
        DingTalkUtils.sendTextMsgToRobot("出现异常啦");
    }

 

posted @ 2019-07-17 10:34  伯安阳明  阅读(452)  评论(0编辑  收藏  举报