同步调用:同步就是整个处理过程顺序执行,当各个过程都执行完毕,并返回结果。
异步调用:只发送了调用的指令,调用者无需等待被调用的方法完全执行完毕;而是继续执行下面的流程。
因为业务流程中可能出现调用后查库而进行写文件的流程,可能因为数据量过大引起TimeOut。用户无法快速拿到文件,所以采用异步处理的方法来先返回filepath和filename,然后让用户在某一段时间过后来获去文件。
SpringBoot可以通过@Async
注解结合@EnableAsync来实现异步调用
@EnableAsync需要加在启动类上
@SpringBootApplication @EnableAsync public class TestApplication { public static void main(String[] args) { SpringApplication.run(Test.class, args); } }
@Async加在需要实现异步任务的接口上
@Async("taskExecutor") public void writeFile(RequestTask requestTask) { try { //To do . . . } catch (Exception e) { e.printStackTrace(); } }
taskExecutor为自定义线程池名称,可在yml文件或config类中配置线程池参数
@Configuration
@EnableAsync
public class ThreadPoolTaskConfig {
//线程池处理task原理
/**
* 默认情况下,在创建了线程池后,线程池中的线程数为0,当有任务来之后,就会创建一个线程去执行任务,
* 当线程池中的线程数目达到corePoolSize后,就会把到达的任务放到缓存队列当中;
* 当队列满了,就继续创建线程,当线程数量大于等于maxPoolSize后,开始使用拒绝策略拒绝
*/
/** 核心线程数(默认线程数) */
private static final int corePoolSize = 20;
/** 最大线程数 */
private static final int maxPoolSize = 100;
/** 允许线程空闲时间(单位:默认为秒) */
private static final int keepAliveTime = 10;
/** 缓冲队列大小 */
private static final int queueCapacity = 200;
/** 线程池名前缀 */
private static final String threadNamePrefix = "Async-Service-";
@Bean("taskExecutor") // bean的名称,默认为首字母小写的方法名
public ThreadPoolTaskExecutor taskExecutor(){
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(corePoolSize);
executor.setMaxPoolSize(maxPoolSize);
executor.setQueueCapacity(queueCapacity);
executor.setKeepAliveSeconds(keepAliveTime);
executor.setThreadNamePrefix(threadNamePrefix);
// 线程池对拒绝任务的处理策略
// CallerRunsPolicy:由调用线程(提交任务的线程)处理该任务
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.initialize();
return executor;
}
}
版权声明:本文为xiaohuihuiaz原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。