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

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

  • 前言

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

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

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

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

    • 2.1指定线程池名称:

    • 2.2配置默认异步线程池:

  • 2.总结:


前言

后端的异步可能不像前端用异步那样频繁,前端渲染页面可能异步处理更常见,后端异步可能考虑的主要是为了增加服务器端的吞吐量。当然有些时候也能提升一些性能。本文主要是总结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时间屋进行讨论。


原文始发于微信公众号(Java时间屋):SpringBoot怎样使用异步注解并且配置指定线程池?

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/251909.html

(0)
java小白的头像java小白

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!