spring异步方法
- 创建自定义线程池
@EnableAsync
@Configuration
//@ComponentScan("zx.sys.service")
public class TaskPoolConfig {
@Bean
public Executor taskExecutor() {
//返回可用处理器的Java虚拟机的数量 12
int i = Runtime.getRuntime().availableProcessors();
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//核心线程池大小
executor.setCorePoolSize(16);
//最大线程数
executor.setMaxPoolSize(20);
//配置队列容量,默认值为Integer.MAX_VALUE
executor.setQueueCapacity(999);
//活跃时间
executor.setKeepAliveSeconds(90);
//线程名字前缀
executor.setThreadNamePrefix("asyncServiceExecutor -");
//设置此执行程序应该在关闭时阻止的最大秒数,以便在容器的其余部分继续关闭之前等待剩余的任务完成他们的执行
executor.setAwaitTerminationSeconds(60);
//等待所有的任务结束后再关闭线程池
executor.setWaitForTasksToCompleteOnShutdown(true);
return executor;
}
}
- 创建异步方法,注解引用上面创建的线程池名称
@Async("taskExecutor")
public String sendEmail() {
try {
Thread.sleep(10000);
System.out.println("等待10秒。。。。");
} catch (Exception e) {
System.out.println("异常啦。。。。");
}
return "正常异步执行结果";
}
3.测试执行
@RequestMapping(produces = "application/json; charset=utf-8")
@ResponseBody
public Object yzExpressOrder(@RequestBody String json){
sysUserService.sendEmail();
System.out.println("第一步执行");
return "";
}
注意:如果异步执行没有生效,说明@Async(“taskExecutor”)所在方法包的路径没有被spring扫描到,需要开启@ComponentScan(“zx.sys.service”)注解