背景需求
实际项目需求,会遇到上传等耗时比较长的任务,需要及时返回结果,不需要任务结束才返回响应,这时就需要异步响应。
1. 配置线程池
@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {
@Override
@Bean
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(4);
executor.setMaxPoolSize(8);
executor.setQueueCapacity(16);
executor.initialize();
return executor;
}
}
2. 任务加入单例模式
@Service
public class AsyncService {
private final static Logger logger= LoggerFactory.getLogger(AsyncService.class);
private final OSS ossClient;
public AsyncService(OSS ossClient) {
this.ossClient = ossClient;
}
@Async
public void asyncFileUpload(MultipartFile file, String buckName, String filePathName) {
try {
logger.info("上传前处理");
ossClient.putObject(buckName, filePathName, file.getInputStream());
logger.info("文件上传成功: {}", filePathName);
} catch (IOException e) {
logger.error("上传失败: {}", e.getMessage(), e);
}
}
}
3. controller层调用,解决问题
@PostMapping("upload")
public AjaxResult upload(MultipartFile file){
logger.info("开始时间上传");
FileUploadUtils.assertAllowed(file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION);
// 编码文件名
String filePathName = FileUploadUtils.extractFilename(file);
// 文件路径名称
String filePathNames = fileHost + "/" + filePathName;
// 调用异步方法上传文件
asyncService.asyncFileUpload(file, buckName, filePathNames);
logger.info("上传任务发送");
return AjaxResult.success("获取成功",filePathName);
}