springboot实现异步任务

背景需求

       实际项目需求,会遇到上传等耗时比较长的任务,需要及时返回结果,不需要任务结束才返回响应,这时就需要异步响应。

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);
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值