上传并异步解析excel

2020-04-23  本文已影响0人  奶盐味小圆饼

需求描述: 文件上传之后返回上传成功结果, 异步解析文件并进行数据处理

第一种实现方式

线程池

@RestController
@RequestMapping("/workflow/v1/")
public class OldCodeHandleController extends BaseController {

    public final ExecutorService executor = Executors.newSingleThreadExecutor();

    @PreDestroy
    public void destroy() {
        logger.info("执行销毁逻辑,释放线程池");
        // 停止接收新的解析任务
        executor.shutdown();
        // 超时关闭线程池
        try {
            boolean isTermination = executor.awaitTermination(1, TimeUnit.MINUTES);
            if (!isTermination) {
                executor.shutdownNow();
            }
        } catch (InterruptedException e) {
            executor.shutdownNow();
        }
    }

   /**
     * 文件上传
     *
     * @param file
     * @return
     */
    @PostMapping("/excel/upload")
    public BaseResponse excelUpload(@RequestBody MultipartFile file) throws IOException {
        executor.submit( () ->  oldCodeHandleService.uploadFile(file));
        return ResponseHelper.createSuccessResponse("文件上传成功");
    }
}

newSingleThreadExecutor

Executors

创建单一线程的线程池
创建单一线程的线程池
public static ExecutorService newSingleThreadExecutor();

关闭线程池

第二种实现方式
用CompletableFuture来实现异步操作
    @PostMapping("/excel/upload")
    public BaseResponse excelUpload(@RequestBody MultipartFile file) throws IOException {
        String fileName = file.getOriginalFilename();
        InputStream fileIs = file.getInputStream();
        CompletableFuture.runAsync(() -> oldCodeHandleService.readExcel(fileIs, fileName));
        return ResponseHelper.createSuccessResponse("文件上传成功");
    }
CompletableFuture的runAsync
public static CompletableFuture<Void> runAsync(Runnable runnable) {
        return asyncRunStage(ASYNC_POOL, runnable);
    }
第三种实现方式
实现Runnable接口复写run方法
public class AsyncTask implements Runnable {

    private final HandleService handleService;

    private final InputStream fileIs;

    private final String fileName;

    public AsyncTask(HandleService handleService, InputStream fileIs, String fileName) {
        this.handleService =handleService;
        this.fileIs = fileIs;
        this.fileName = fileName;
    }

    @Override
    public void run() {
        handleService.readExcel(fileIs, fileName);
    }
}
创建线程池
private ExecutorService executorService = Executors.newFixedThreadPool(10);
向线程池提交任务
executorService.submit(new AsyncTask(handleService, fileIs, fileName));
上一篇 下一篇

猜你喜欢

热点阅读