異步上傳石墨文件進度條前端展示記錄(采用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
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/82778.shtml
英文地址,請注明出處:http://en.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&…