耗时任务的触发接口与状态检测接口-案例 demo

controller 层

  @Autowiredprivate DownloadService service;// 触发下载任务@GetMapping(value = "/downloadData")@ResponseBodypublic Result<Object> downloadData(ServletRequest request,@RequestParam(value = "userId",defaultValue = "anonymous") String userId)throws IOException {log.info("---------------downloadData start-------------");String rootDirectory = request.getServletContext().getRealPath("/");log.info("rootDirectory:"+rootDirectory);// 临时放置文件目录Path p = Paths.get(rootDirectory, "temp");if (!p.toFile().exists()) {p.toFile().mkdirs();}this.service.createDownloadingDataTask(userId);return Result.ok();}//@ApiOperation("检测下载进度")@GetMapping(value = "/check4DownloadingData")public Object check4DownloadingData(@RequestParam(value = "userId",defaultValue = "anonymous") String userId) throws IOException {Result<Object> result = this.service.check4DownloadingDataTask(wwId);if(result.isOK()){File file = (File) result.getResult();// 下载成功返回二进制流return getResponseEntity(file,null,false);}
//        ResponseEntity<String> responseEntity = ResponseEntity.ok()
//                .header("Content-Type", "application/json")
//                .body("Hello World");ResponseEntity<String> responseEntity = new ResponseEntity<>(result.getMsg(), HttpStatus.OK);return responseEntity;}

//service 层不贴了,直接上 serviceImpl 实现类

package com.example.demo.service.impl;import com.example.demo.service.COCReportService;
import com.example.demo.utils.Result;
import com.example.demo.utils.databricks.DatabricksTemplate;
import com.example.demo.utils.poi.render.coc.COCExcelRender;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.io.File;
import java.nio.file.Path;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.Callable;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;@Service
@Slf4j
public class DownloadServiceImpl implements DownloadService {/*** 针对 coc 导出过程数据的文件缓存* Map<String,File> => Map<userId,File>*/private static Map<String,Future<File>>  cache_files = new HashMap<>();@Overridepublic Future<File> createDownloadingDataTask(String userId) {Callable<File> callable = new DownloadingDataTask(userId);FutureTask<File> task = new FutureTask<File>(callable);// 开始执行new Thread(task).start();// 保存凭证cache_files.put(wwId,task);return task;}private static class DownloadingDataTask implements Callable<File>{private String userId;public COCDownloadingDataTask(String userId) {this.userId = userId;}@Overridepublic File call() throws Exception {log.info("---------------downloadData start 2 Render.... -------------");File file = null;try{// 根据自己的业务逻辑,生成 filefile =new File("");log.info("###------------the excel file address:"+file.getAbsolutePath());return file;}catch (Throwable e){log.info(e.getMessage());return null;}}}@Overridepublic Result<Object> check4DownloadingDataTask(String userId) {Future<File> future=  cache_files.get(wwId);if(future==null){return Result.failed("当前用户不存在下载任务,无数据文件下载。");}if(!future.isDone()){return Result.failed("数据文件生成中…请等待1分钟后,点击”回车“确认状态。");}try {return Result.ok(future.get());} catch (Exception e) {log.error(e.getMessage());return Result.failed("任务执行异常,请联系管理员查看日志。");}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/723978.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从0到1入门C++编程——09 STL、string容器、vector容器、deque容器

文章目录 一、标准模板库STL二、容器算法迭代器应用1、遍历容器中整型数据2、遍历容器中自定义数据类型3、容器中嵌套容器 三、string容器1、构造函数2、赋值操作3、字符串拼接4、查找和替换5、字符串比较6、字符访问与存取7、插入和删除8、子串 四、vector容器1、构造函数2、赋…

游戏力:竞技游戏设计实战教程

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 游戏力&#xff1a;竞技游戏设计实战教程 引言…

GBU3010-ASEMI火牛适配器专用整流桥GBU3010

编辑&#xff1a;ll GBU3010-ASEMI火牛适配器专用整流桥GBU3010 型号&#xff1a;GBU3010 品牌&#xff1a;ASEMI 封装&#xff1a;GBU-4 最大重复峰值反向电压&#xff1a;1000V 最大正向平均整流电流(Vdss)&#xff1a;30A 功率(Pd)&#xff1a;大功率 芯片个数&…

前端运算符比较与计算中的类型转换,运算规则

题目&#xff1a; 下面表达式的值分别都是什么&#xff08;类型转换&#xff09; 0 0 0 2 true 2 false false false false 0 false undefined false null null undefined\t\r\n 0JS中的原始类型有哪些 原始值类型就是 存储的都是值&#xff0c;没有函数可以调用的。…

【C++】二叉树进阶面试题(下)

目录 6. 根据一棵树的前序遍历与中序遍历构造二叉树 题目 分析 代码 7. 根据一棵树的中序遍历与后序遍历构造二叉树 题目 分析 代码 8. 二叉树的前序遍历&#xff0c;非递归迭代实现 题目 分析 代码 9. 二叉树中序遍历 &#xff0c;非递归迭代实现 题目 分析 …

Vue跳转页面传递参数

Vue跳转页面传递参数 &#x1f31f; 前言 欢迎来到我的小天地&#xff0c;这里是我记录技术点滴、分享学习心得的地方。&#x1f4da; &#x1f6e0;️ 技能清单 编程语言&#xff1a;Java、C、C、Python、Go、前端技术&#xff1a;Jquery、Vue.js、React、uni-app、EchartsUI…

RLNNA-DBSCAN聚类

RLNNA-DBSCAN聚类 RLNNA算法&#xff08;基于强化学习的神经网络优化算法&#xff09;是一种性能较佳的优化算法。DBSCAN聚类算法&#xff08;密度聚类算法&#xff09;是一种基于密度的聚类算法&#xff0c;其主要思想是通过寻找样本点周围的密度可达关系来聚类数据。 使用RL…

自动化专家来谈谈Selenium中的时间等待

在 Selenium 中&#xff0c;时间等待指在测试用例中等待某个操作完成或某个事件发生的时间。Selenium 中提供了多种方式来进行时间等待&#xff0c;包括使用 ExpectedConditions 中的 presence_of_element_located 和 visibility_of_element_located 方法等待元素可见或不可见&…

小白如何选择阿里云服务器配置?小白不怕

阿里云服务器配置怎么选择&#xff1f;CPU内存、公网带宽和系统盘怎么选择&#xff1f;个人开发者或中小企业选择轻量应用服务器、ECS经济型e实例&#xff0c;企业用户选择ECS通用算力型u1云服务器、ECS计算型c7、通用型g7云服务器&#xff0c;阿里云服务器网aliyunfuwuqi.com整…

事件流、事件捕获、事件冒泡、事件委托

一、事件流 事件流指的是事件完整执行过程中的流动路径&#xff0c;分为捕获阶段、冒泡阶段。如上图 二、事件捕获 当一个元素的事件被触发时&#xff0c;会从DOM的根元素开始&#xff0c;依次调用同名事件&#xff08;从外到里&#xff0c;从父到子&#xff09;。 DOM.addEve…

基于炬芯ATS283X头戴式蓝牙耳机开发

基于炬芯ATS283X头戴式蓝牙耳机开发 是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?可加他微信hezkz17, 本群提供音频技术答疑服务,+群赠送蓝牙音频,DSP音频项目核心开发资料, 1 电路设计 2 SDK 开发

CryoEM - CryoAI: Amortized Inference of Poses 工程源码复现

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/136384544 Paper: CryoAI: Amortized Inference of Poses for Ab Initio Reconstruction of 3D Molecular Volumes from Real Cryo-EM Images CryoAI: 基于摊…

国产嵌入式DSP教学实验箱_操作教程:22-AD采集DA输出实验(采集输出正弦波)

一、实验目的 掌握EMIFA、SPI的使用&#xff0c;了解AD7606、AD5724的芯片特性和使用&#xff0c;并实现基于AD7606采集、AD5724输出正弦波。 二、实验原理 StarterWare StarterWare是一个免费的软件开发包&#xff0c;它包含了示例应用程序。StarterWare提供了一套完整的G…

代码随想录刷题笔记-Day30

1. 解数独 37. 解数独https://leetcode.cn/problems/sudoku-solver/ 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff1a; 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x…

打动HR的秘密武器:四款在线简历制作网站,让你脱颖而出!

如果你想找到一份好工作&#xff0c;你必须先写一份优秀的工作。在这个人力资源部承认一天要看数百份简历的时代&#xff0c;求职者需要一份优秀的简历才能脱颖而出&#xff0c;获得面试机会。 现实中&#xff0c;很多人往往无法设计出满意的简历&#xff0c;所以他们甚至没有…

人工智能-飞桨

文章目录 概要安装零基础教程基础知识小结 概要 集核心框架、基础模型库、端到端开发套件、丰富的工具组件于一体的深度学习平台 官方入口 安装 python安装 python官方下载 PaddlePaddle安装 python -m pip install paddlepaddle2.6.0 -i https://mirror.baidu.com/pypi/s…

上位机图像处理和嵌入式模块部署(qmacvisual三个特色)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 了解了qmacvisual的配置之后&#xff0c;正常来说&#xff0c;我们需要了解下不同插件的功能是什么。不过我们不用着急&#xff0c;可以继续学习下…

MySQL数据库技术(二)

MySQL数据库技术&#xff08;1X&#xff09; 定义表的时候&#xff0c;需要确定每个字段的数据类型。MySQL 支持多种数据类型&#xff0c; 大致可以分为三类&#xff1a;数值类型、日期/时间类型和字符串类型。 数值类型 数值类型包括 5 种整数、2 种浮点数和 1 种定点数&a…

Java 实现国网698协议,帧头、数据帧校验算法

最近在做电表测试相关软件&#xff0c;开发过程需要学习698协议&#xff0c;网上关于698协议的资料很少。此文记录一下协议中关于帧头和整帧校验码算法&#xff0c;Java代码如下&#xff1a; public class Test {public static void main(String[] args) {//定义一个字节数据用…

mac设置java环境变量

在 macOS 系统上&#xff0c;设置 JAVA_HOME 环境变量可以通过以下步骤进行&#xff1a; 打开终端应用程序。 输入以下命令来查找 Java 的安装路径&#xff1a;/usr/libexec/java_home 终端会返回 Java 的安装路径&#xff0c;类似 /Library/Java/JavaVirtualMachines/jdk1.…