SpringBoot怎样使用异步注解并且配置指定线程池?

前言

后端的异步可能不像前端用异步那样频繁,前端渲染页面可能异步处理更常见,后端异步可能考虑的主要是为了增加服务器端的吞吐量。当然有些时候也能提升一些性能。本文主要是总结springboot中使用异步并且指定线程池的技巧,希望能跟朋友进行一番交流。

1.怎样在SpringBoot中使用异步:

1.1启动类或者配置类上面开启异步功能:

@EnableAsync
举例子:

@SpringBootApplication
@MapperScan("xxx")
@EnableAsync
public class SpringBootApplication{
    
    
}

1.2方法上进行添加异步注解开启异步:

举例子:

  @Async
    public void sendSimpleMail(String to, String subject, String content) {
        System.out.println(Thread.currentThread().getName());
        SimpleMailMessage message = new SimpleMailMessage();
        message.setTo(to);//收信人
        message.setSubject(subject);//主题
        message.setText(content);//内容
//        message.setCc(from);
//        message.setBcc(from);
        message.setFrom(from);//发信人
        mailSender.send(message);

    }
    @Async("threadPoolTaskExecutor")
    public void sendSimpleMail2(String to, String subject, String content) {
        System.out.println(Thread.currentThread().getName());
        SimpleMailMessage message = new SimpleMailMessage();
        message.setTo(to);//收信人
        message.setSubject(subject);//主题
        message.setText(content);//内容
//        message.setCc(from);
//        message.setBcc(from);
        message.setFrom(from);//发信人
        mailSender.send(message);

    }

说明:异步注解的使用在同一service中调用是不生效的,必须在非注解异步方法所在的service中进行使用才能达到异步使用的效果。

2.指定线程池的两种方法:

在异步方法中进行打印线程名字,发现如果没有配置异步线程池的话默认使用的是:SimpleAsyncTaskExecutor

System.out.println(Thread.currentThread().getName());

2.1指定线程池名称:

向上面代码写的一样:

 @Async("threadPoolTaskExecutor")
    public void sendSimpleMail2(String to, String subject, String content) {
        System.out.println(Thread.currentThread().getName());
        SimpleMailMessage message = new SimpleMailMessage();
        message.setTo(to);//收信人
        message.setSubject(subject);//主题
        message.setText(content);//内容
//        message.setCc(from);
//        message.setBcc(from);
        message.setFrom(from);//发信人
        mailSender.send(message);

    }

构造函数进行传递异步的线程池配置参数:
@Async(“threadPoolTaskExecutor”)
实现异步线程池的配置。
其中线程池配置为:

@Configuration
@EnableAsync
public class ExecutorConfig {
    private static final Logger logger = LoggerFactory.getLogger(ExecutorConfig.class);

    @Bean(name = "threadPoolTaskExecutor")
    public ThreadPoolTaskExecutor threadPoolTaskExecutor() {
        ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor();
        pool.setKeepAliveSeconds(300);
        pool.setCorePoolSize(5);//核心线程池数
        pool.setMaxPoolSize(10); // 最大线程
        pool.setQueueCapacity(100);//队列容量
        pool.setAwaitTerminationSeconds(1);
        pool.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); //队列满,线程被拒绝执行策略
        pool.setWaitForTasksToCompleteOnShutdown(true);
        pool.setAwaitTerminationSeconds(1);
        pool.setThreadNamePrefix("oooooo");
        return pool;
    }
}

2.2配置默认异步线程池:

如果不想每个方法进行注解传入线程池的话,也可以统一默认的给异步方法进行赋值线程池。就是实现接口:AsyncConfigurer。
代码实现:

@Configuration
@EnableAsync
@Slf4j
public class AsyncConfig implements AsyncConfigurer {


    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(8);
        executor.setMaxPoolSize(8);
        executor.setQueueCapacity(100);
        executor.setThreadNamePrefix("CustomAsyncExecutor-");
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
        executor.initialize();
        return executor;
    }

2.总结:

上面就是我总结的SpringBoot异步注解的使用介绍,总的来说是一次比较全面的总结,如果感兴趣的朋友请留言,或者关注我的公众号:Java时间屋进行讨论。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值