-
前言
-
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