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