excel导出因SQL耗时过长导致接口超时解决思路

思路:1. 查看文件是否生成,生成直接返回。2、没有生成,加锁进行异步耗时操作生成。

    private Executor executor =  Executors.newFixedThreadPool(32);
    private Set<String> lock = Collections.newSetFromMap(new ConcurrentHashMap<>());

    //调用者需要判断是否为null,null表示正在运行返回提示。否则就能拿到文件下载了。
    public File asyncCreateAnchorExcel(Param param) throws IOException {
        String fileName = createFileName(param);
        File f = new File(System.getProperty("java.io.tmpdir") + fileName);
        //表示文件还没生成
        if(!f.exists()) {
            //对文件进行加锁并异步生成
            if(lock.add(fileName)) {
                executor.execute(() -> {
                    try {
                        //需要进行本地耗时生成文件
                        longTimeOperation(param);
                    } catch (Exception e) {
                        logger.error("create error: " + e.getMessage(), e);
                    } finally {
                        //生成完毕需要解锁
                        lock.remove(fileName);
                    }
                });
            }
            return null;
        } else {
            return f;
        }
    }

 

posted @ 2022-05-11 18:11  数学与IT  阅读(463)  评论(0编辑  收藏  举报