1.定义异步线程池
package com.*;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
/**
* @author qiminhui
*/
@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {
@Override
public Executor getAsyncExecutor(){
//定义线程池
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
//核心线程数
taskExecutor.setCorePoolSize(5);
//线程池最大数量
taskExecutor.setMaxPoolSize(10);
//创建队列最大数量
taskExecutor.setQueueCapacity(100);
//初始化
taskExecutor.initialize();
return taskExecutor;
}
}
2.服务接口
package com.*;
/**
* @author qiminhui
*/
public interface AsyncService {
/**
* 模拟报表生成的异步方式
*/
void generateReport();
}
3.服务接口实现类
package com.*;
import com.paic.gamma.apply.service.AsyncService;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
/**
* @author qiminhui
*/
@Service
public class AsyncServiceImpl implements AsyncService {
@Override
@Async
public void generateReport() {
//打印线程名称
System.out.println("报表线程名称:" + Thread.currentThread().getName());
}
}
4.异步调用控制器
package com.*;
import com.paic.gamma.apply.service.AsyncService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author qiminhui
*/
@RestController
public class AsyncController {
@Autowired
private AsyncService asyncService;
@GetMapping("/asyncPage")
public String asyncPage(){
System.out.println("请求线程名称:" + Thread.currentThread().getName());
//调用异步服务
asyncService.generateReport();
return "asyncPage";
}
}
5.结果:
请求线程名称:http-nio-8080-exec-8
10:11:55.869 INFO 9840 --- [nio-8080-exec-8] c.p.g.a.w.c.advice.SysLogAdvisor : [response]:AsyncController.asyncPage-->"asyncPage"
报表线程名称:ThreadPoolTaskExecutor-2