异步上传石墨文件进度条前端展示记录(采用Redis中String数据结构实现)

事件起因是客户现场需要从石墨文档中获取文件信息,文件信息存在存在多个,进行批量上传。为了用户的友好型体验,需要做进行条展示的方式,具体实现见下文…

上传流程介绍

石墨文档支持从链接🔗方式获取文件信息,通过对文件链接的截取,会得到16位编码的值。同时不仅仅针对单文档,也支持指定文件夹或者空间下的方式,只需要对对应的文档或者文件夹📁或者空间添加对应的协作者(石墨文档API下载需要私有化部署之后才可以提供,官方不带开放平台)。就可以通过对应的下载文档接口进行对应的逻辑下载,关于如何下载的大致流程如下图所示。本次只介绍进度条逻辑如何实现,关于如何上传本次文章不做展开。

服务流程示意图

用户层面结合技术层面大致的交互流程是,用户首先从石墨文档获取需要上传的文档链接,进行录入到对应的系统界面。调用后端服务的方式,由后端服务通过配置相关密钥与协作者(石墨管理员)获取相关文档信息。将获取到的相关文档之后,在业务服务中进行与redis交互,存储进入进度。

Talk is easy show me the code

redis存储类实体类

public class RedisTaskProcess {@Schema(description = "消息id")private String taskId;@Schema(description = "业务类型,定义自己的任务类型xxxxx")private String businessType;@Schema(description = "处理进度的百分比")private BigDecimal processPercent;@Schema(description = "任务状态, processing|completed|error|cancel")private String status = "processing";@Schema(description = "消息描述, 异常时或者特殊场景会指定消息")private String msg;@Schema(description = "用户编码,用于获取任务Key")private String userCode;@Schema(description = "任务标题(文件名)")private String title;@Schema(description = "创建时间")private Long createTime;/*** 启动一个长任务处理流程,并返回任务处理响应对象。* * @param businessType 业务类型,用于标识任务的业务场景。* @param userCode 用户代码,标识发起任务的用户。* @param title 任务标题,用于描述任务内容。* @param redisTemplate Redis模板对象,用于将任务信息存储到Redis中。* @return LongTaskProcessResponse 返回长任务处理响应对象,包含任务ID、状态、进度等信息。*/
public static RedisTaskProcess commonStart(String businessType, String userCode, String title, RedisTemplate<String, Object> redisTemplate) {// 初始化长任务处理响应对象RedisTaskProcess res = new RedisTaskProcess();// 设置任务ID、业务类型、状态、消息、标题、进度、用户代码和创建时间res.setTaskId(IdUtil.getSnowflakeNextIdStr());res.setBusinessType(businessType);res.setStatus("processing");res.setMsg("开始处理");res.setTitle(title);res.setProcessPercent(new BigDecimal(1));res.setUserCode(userCode);res.setCreateTime(System.currentTimeMillis());// 将任务信息存储到Redis中,并设置过期时间为1天redisTemplate.opsForValue().set(res.findTaskCacheKey(), res, 1, TimeUnit.DAYS);return res;
}/*** 完成任务的通用方法,用于设置任务状态为“已完成”,并更新相关信息到Redis缓存中。** @param completeMsg 任务完成时的消息内容,用于设置任务的msg字段。* @param redisTemplate Redis操作模板,用于将任务信息存储到Redis缓存中。*/
public void commonComplete(String completeMsg, RedisTemplate<String, Object> redisTemplate) {// 设置任务状态为“已完成”this.setStatus("completed");// 设置任务完成消息this.setMsg(completeMsg);// 设置任务进度为100%this.setProcessPercent(new BigDecimal(100));// 设置任务创建时间为当前时间this.setCreateTime(System.currentTimeMillis());// 将任务信息存储到Redis缓存中,并设置过期时间为1天redisTemplate.opsForValue().set(this.findTaskCacheKey(), this, 1, TimeUnit.DAYS);
}/*** 执行通用的更新操作,并调用重载的 `commonUpdate` 方法。** @param status 当前状态信息,通常用于表示操作的状态。* @param msg 更新操作的消息或描述信息。* @param addPercent 需要增加的百分比值,通常用于表示进度或比例的增加。* @param redisTemplate Redis 操作模板,用于与 Redis 进行交互。*/
public void commonUpdate(String status, String msg, Integer addPercent, RedisTemplate<String, Object> redisTemplate) {this.commonUpdate(status, msg, addPercent, null, redisTemplate);
}/*** 更新任务状态信息,并将更新后的任务信息存储到Redis中。** @param status 任务状态,用于设置当前任务的状态。* @param msg 任务消息,用于设置当前任务的消息内容。* @param addPercent 增加的进度百分比,用于计算当前任务的进度。* @param title 任务标题,如果非空则更新任务的标题。* @param redisTemplate Redis模板对象,用于将任务信息存储到Redis中。*/
public void commonUpdate(String status, String msg, Integer addPercent, String title, RedisTemplate<String, Object> redisTemplate) {// 设置任务状态和消息this.setStatus(status);this.setMsg(msg);// 如果提供了任务标题,则更新标题if (title != null) {this.setTitle(title);}// 计算并更新任务进度,确保进度不超过99%BigDecimal calRes = this.getProcessPercent().add(new BigDecimal(addPercent));this.setProcessPercent(calRes.min(new BigDecimal(99)));// 设置任务的创建时间this.setCreateTime(System.currentTimeMillis());// 将更新后的任务信息存储到Redis中,并设置过期时间为1天redisTemplate.opsForValue().set(this.findTaskCacheKey(), this, 1, TimeUnit.DAYS);
}/*** 处理通用失败情况,并将失败信息存储到Redis中。** 该方法将当前对象的状态设置为"error",并设置失败信息。同时,记录当前时间作为创建时间,* 并将整个对象存储到Redis中,缓存时间为1天。** @param failMsg 失败信息,用于描述失败的原因或详情。* @param redisTemplate Redis操作模板,用于与Redis进行交互。*/
public void commonFailure(String failMsg, RedisTemplate<String, Object> redisTemplate) {// 设置状态为"error",表示任务失败this.setStatus("error");// 设置失败信息this.setMsg(failMsg);// 记录当前时间作为创建时间this.setCreateTime(System.currentTimeMillis());// 将当前对象存储到Redis中,缓存时间为1天redisTemplate.opsForValue().set(this.findTaskCacheKey(), this, 1, TimeUnit.DAYS);
}/*** 生成任务缓存的唯一键。** 该函数通过将任务处理前缀、用户代码和任务ID拼接成一个字符串,生成一个唯一的缓存键。* 该键通常用于在缓存系统中标识和存储与特定任务相关的数据。** @return 返回一个格式化的字符串,表示任务缓存的唯一键。格式为:"任务处理前缀:用户代码:任务ID"。*/
public String findTaskCacheKey() {return String.format("%s:%s:%s", TASK_PROCESS_PREFIX_KEY, this.userCode, this.taskId);
}}

上传服务伪代码

public void updatexxxx{try{// 业务测文件集合List fileIdList = new ArrayList();// 业务代码填充xxxxxxx// 初始化进度响应对象RedisTaskProcess redisTaskProcess = RedisTaskProcess.commonStart("业务代码","业务代码","业务代码");// 计算文件进度int documentationProgress = 99 / fileIdList.size();// 指定上传逻辑伪代码fileIdList.forEach(fileId -> {// 业务代码逻辑xxxxxx// 更新文件进度redisTaskProcess..commonUpdate("processing", "正在处理文件: " + save.getFileName(), progressIncrement, redisTemplate);})// 完成长传逻辑commonComplete("文档下载完成", redisTemplate);} catch {log.error("文档下载处理失败", e);redisTaskProcess.commonFailure("文档下载处理失败: " + e.getMessage(), redisTemplate);throw new RuntimeException(e);}}

上述方式采用redis的string数据结构进行存储进度,存在些许弊端。在高并发场景下需要额外考虑乐观锁等机制避免数据覆盖,需要使用WATCH命令或Lua脚本确保原子性。上述问题将在下一篇文章中进行解决…

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

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

相关文章

3D建模的全景图谱:从55个工具到元宇宙的数字革命

3D建模已从专业工程师的工具箱演变为全民创作的数字语言。从代码驱动的精确建模到AI自动生成纹理&#xff0c;从开源协作到程序化生成城市&#xff0c;技术正重塑我们创造虚拟世界的方式。本文将系统解析55个核心3D建模工具/插件&#xff0c;涵盖在线编辑器、开源软件、程序化生…

jsrpc进阶模式 秒杀js前端逆向问题 burp联动进行爆破

案例演示 思路就是 这个 jsrpc远程加载加密函数的方法就是 在js代码中进行插入一个 远程加载的代码 从而实现 &#xff1a; 第一步还是使用 js_tools 进行 查找算法的位置 这个可以帮助我们找到明文>密文 加密算法函数的位置 因为这个需要我们进行js前端代码的修改 所以…

基于BERT-Prompt的领域句子向量训练方法

基于BERT-Prompt的领域句子向量训练方法 一、核心原理:基于BERT-Prompt的领域句子向量训练方法 论文提出一种结合提示学习(Prompt Learning)和BERT的领域句子向量训练方法,旨在解决装备保障领域文本的语义表示问题。核心原理如下: 以下通过具体例子解释传统词向量方法和…

Python PyMySQL

1.PyMySQL是什么 是Python操作mysql的一个包 2.PyMySQL使用基本步骤 2.1 创建连接 conn pymysql.connect(host10.248.53.148,password123456,port3306,userroot,databasetest_database,charsetutf8)2.2 游标 2.2.1 什么是游标 游标实际上是一种能从包括多条数据记录的结果…

OC—UI学习-1

OC—UI学习 UILabel UILabel是UIKit框架中的一个类Label主要参数 text&#xff1a;文本frame&#xff1a;位置框架backgroundcolor&#xff1a;背景颜色textAlignment&#xff1a;设置文本在Label中的位置textColor&#xff1a;文本颜色shadowColor&#xff1a;阴影颜色shado…

【应用密码学】实验七 Hash函数——SM3

一、实验要求与目的 理解哈希函数的基本原理及在密码学中的应用&#xff1b;掌握国密哈希标准 SM3 的算法结构&#xff1b;编程实现 SM3 摘要算法&#xff0c;包括消息填充、消息扩展、压缩函数及摘要输出&#xff1b;对中间变量 W、W′ 和 A~H 的迭代过程进行可视化&#xff…

进行性核上性麻痹护理之道:助力患者舒适生活

进行性核上性麻痹是一种缓慢进展的神经退行性疾病&#xff0c;主要影响患者的运动、语言和吞咽功能&#xff0c;给日常生活带来诸多不便。除了遵医嘱接受药物或物理治疗&#xff0c;科学的健康护理对延缓病情发展、提升生活质量尤为重要。 运动康复是护理的关键环节。由于患者常…

5G 核心网中 NRF 网元的功能、接口及参数详解

引言 在 5G 核心网的架构体系里,网络存储功能(Network Repository Function,NRF)占据着关键地位,承担着核心网网络功能(Network Function,NF)的注册、发现以及服务管理等重要任务,为整个 5G 网络的高效稳定运行提供了坚实支撑。接下来,让我们深入剖析 NRF 网元在注册…

HUAWEI交换机配置镜像口验证(eNSP)

技术术语&#xff1a; 流量观察口&#xff1a;就是我们常说的镜像口&#xff0c;被观察的流量的引流目的端口 流量源端口&#xff1a;企业生产端口&#xff0c;作为观察口观察对象。 命令介绍&#xff1a; [核心交换机]observe-port [观察端口ID或编号&#xff08;数字&am…

Spring AI Alibaba 发布企业级 MCP 分布式部署方案

作者&#xff1a; 影子&#xff0c;刘宏宇&#xff0c;刘军 Spring AI 通过集成 MCP 官方的 java sdk&#xff0c;让 Spring Boot 开发者可以非常方便的开发自己的 MCP 服务&#xff0c;把自己企业内部的业务系统通过标准 MCP 形式发布为 AI Agent 能够接入的工具&#xff1b;…

Redis实战-缓存篇(万字总结)

前言&#xff1a; 今天结合黑马点评这个项目&#xff0c;讲下有关Redis缓存的一些内容&#xff0c;例如缓存更新策略&#xff0c;缓存穿透&#xff0c;雪崩和击穿等。 今日所学&#xff1a; 什么是缓存缓存更新策略缓存穿透缓存雪崩缓存击穿缓存工具封存 目录 1.什么是缓存…

openFuyao开源发布,建设多样化算力集群开源软件生态

openFuyao 开源发布 随着 AI 技术的高速发展&#xff0c;算力需求呈爆发式增长&#xff0c;集群已成为主流生产方式。然而&#xff0c;当前集群软件生态发展滞后于硬件系统&#xff0c;面临多样化算力调度困难、超大规模集群软件支撑不足等挑战。这些问题的根源在于集群生产的…

深入理解 Redis 哨兵模式

Redis 哨兵模式深度解析&#xff1a;从原理到实践的全流程指南 在分布式系统架构中&#xff0c;Redis 作为高性能的内存数据库&#xff0c;其哨兵模式&#xff08;Sentinel&#xff09;是保障服务高可用性的核心方案。本文将从基础概念、运行机制出发&#xff0c;结合具体配置…

HackMyVM-Find

信息搜集 主机发现 ┌──(root㉿kali)-[~] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:39:60:4c, IPv4: 192.168.43.126 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.43.1 c6:45:66:05:91:88 …

2025年渗透测试面试题总结-匿名[校招]安全服务工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 匿名[校招]安全服务工程师 一面问题与完整回答 1. 学校、专业、成绩与排名 2. 学习安全时长 3. 当前学习…

TopCode之手撕快排

题目链接 912. 排序数组 - 力扣&#xff08;LeetCode&#xff09; 题目解析 算法原理 使用数组分三块的思想 i用来遍历整个数组 left用来标记<key的边界 right用来标记>key的边界 然后i进行遍历,数组就分成了四块 [l,left]<key [left1,i-1]key [i,right-1]未…

bi软件是什么?bi软件是做什么用的?

目录 一、BI 软件是什么 1. 基本概念 2. 工作原理 二、BI 软件是做什么用的&#xff1f; 1. 精准洞察市场趋势 2. 优化企业战略规划 3. 辅助投资决策 三、如何选择合适的 BI 软件 1.功能匹配度 2.易用性和可扩展性 3.数据安全和稳定性 4.技术支持和服务 总结 生产…

11.14 LangGraph检查点系统实战:AI Agent会话恢复率提升287%的企业级方案

使用 LangGraph 构建生产级 AI Agent:LangGraph 持久化与记忆的"检查点系统的实现" 关键词:LangGraph 检查点系统,多回合记忆,状态持久化,会话恢复,AI Agent 容错机制 1. 检查点系统的核心价值 在复杂对话场景中,AI Agent 需要处理长达数十轮甚至数百轮的交…

鸿蒙完整项目-仿盒马App(一)首页静态页面

跟着鸿蒙小林博主&#xff0c;练习下项目~记录下首页的搭建,后续继续完善和整体项目完成会进行布局修改&#xff0c;先按照博主的跟做&#xff0c;后续在改 1.分为底部整体框架搭建 2.首页布局&#xff08;顶部搜索、新人专享、金刚区&#xff08;两个不同集合数据&#xff09…

LINUX安装运行jeelowcode后端项目(idea启动)

参考 LINUX安装运行jeelowcode后端项目&#xff08;命令行&#xff09;-CSDN博客 IntelliJ IDEA下载地址&#xff08;社区版、付费版&#xff09;-CSDN博客 软件已安装好&#xff0c;数据库也初始化完毕。 步骤1&#xff1a;打开项目目录步骤2&#xff1a;配置JDK步骤3&…