異步上傳石墨文件進度條前端展示記錄(采用Redis中String數據結構實現-蘇東坡版本)

昔者,有客臨門,亟需自石墨文庫中擷取卷帙若干。此等文冊,非止一卷,乃累牘連篇,亟需批量轉置。然吾輩慮及用戶體驗,當效東坡"腹有詩書氣自華"之雅意,使操作如行云流水,遂定以條分縷析之法,列其要目于屏間,令觀者一目了然,恰似"大江東去,浪淘盡"之暢達,去繁就簡,存精去蕪,使界面如清風明月,操作若庖丁解牛。具體之法,容后詳敘…

上傳流程介紹

石墨云臺藏機杼,以鏈為引可通幽。昔者匠人剖玉,今人截鏈取牘,得十六位秘鑰,若敦煌經卷之編號,暗藏玄機。其法非獨單卷,亦通全冊,或拓一室之藏,但添協作者于卷軸、函匣、書閣之間,如邀蘇子瞻共游赤壁,許其同覽文海。然需筑私邸于云中(私有化部署),方得啟下載之門徑,此間玄妙,非市井可窺。

進度條之藝,恰似東坡觀潮:初見細浪如銀線,漸涌為雪堆千疊,終成驚濤拍岸之勢。其理有三:一曰分黍定寸(任務切分),二曰燃香計時(進度追蹤),三曰墨染絹帛(界面渲染)。每完成一卷,則添一筆于素箋,恰似東坡夜游承天寺,見"庭下如積水空明",步步生輝。其間奧義,非止術數,更含天地運行之理,今且述其梗概,余者待諸君細參。

服務流程示意圖

文樞流轉之法,恰似東坡治水之道。用戶執鏈如持竹簡,錄于云臺(系統界面),此乃"大江初發昆侖源"之始。后端服務承此簡牘,以密鑰為符,協作者為印,啟石墨秘庫之門,如子瞻開赤壁石壁,得見卷帙浩繁。

所得文牘既至,當效東坡"腹中貯書一萬卷"之法,分存于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玉匣存進度,雖得"輕舟已過萬重山"之速,然遇千帆競渡之時,猶恐"驚濤拍岸卷千堆雪"。蓋因弦歌未絕,已有新篙入水,玉匣刻痕易為后浪所湮,此乃"前度劉郎今又來"之困也。
欲解此困,當效東坡"廬山煙雨浙江潮"之禪機:或借WATCH法眼觀潮,察毫厘之變;或運Lua神筆,繪原子之章。其間妙理,非止于術,更在"不識廬山真面目"之破局——使進度刻痕如西子湖心月,任爾千帆過盡,自有清輝長明。然此中三昧,且待下回分說,恰似"欲把西湖比西子"之未盡余韻…

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/907900.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/907900.shtml
英文地址,請注明出處:http://en.pswp.cn/news/907900.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Axure 基礎入門

目錄 認識產品經理 項目團隊* 基本概述 認識產品經理 A公司產品經理 B公司產品經理 C公司產品經理 D公司產品經理 產品經理工作范圍 產品經理工作流程* 產品經理的職責 產品經理的分類 產品經理能力要求 產品工具 產品體驗報告 原型設計介紹 原型設計概述 為…

零基礎學習計算機網絡編程----socket實現UDP協議

本章將會詳細的介紹如何使用 socket 實現 UDP 協議的傳送數據。有了前面基礎知識的鋪墊。對于本章的理解將會變得簡單。將會從基礎的 Serve 的初始化&#xff0c;進階到 Client 的初始化&#xff0c;以及 run。最后實現一個簡陋的小型的網絡聊天室。 目錄 1.UdpSever.h 1.1 構造…

普中STM32F103ZET6開發攻略(二)

接上文&#xff1a;普中STM32F103ZET6開發攻略&#xff08;一&#xff09;-CSDN博客 各位看官老爺們&#xff0c;點擊關注不迷路喲。你的點贊、收藏&#xff0c;一鍵三連&#xff0c;是我持續更新的動力喲&#xff01;&#xff01;&#xff01; 目錄 接上文&#xff1a;普中…

用提示詞寫程序(3),VSCODE+Claude3.5+deepseek開發edge擴展插件V2

edge擴展插件;篩選書簽,跳轉搜索,設置背景 鏈接: https://pan.baidu.com/s/1nfnwQXCkePRnRh5ltFyfag?pwd86se 提取碼: 86se 導入解壓的擴展文件夾: 導入擴展成功: edge擴展插件;篩選書簽,跳轉搜索,設置背景

電腦桌面便簽軟件哪個好?桌面好用便簽備忘錄推薦

在日常辦公中&#xff0c;一款優秀的桌面便簽工具能顯著提升工作效率。面對市面上琳瑯滿目的選擇&#xff0c;不少用戶都難以抉擇。如果你正在尋找一款兼具輕量化與多功能性的便簽軟件&#xff0c;那么集實用性與便捷性于一身的"好用便簽"&#xff0c;或許就是你的理…

性能優化 - 工具篇:基準測試 JMH

文章目錄 Pre引言1. JMH 簡介2. JMH 執行流程詳解3. 關鍵注解詳解3.1 Warmup3.2 Measurement3.3 BenchmarkMode3.4 OutputTimeUnit3.5 Fork3.6 Threads3.7 Group 與 GroupThreads3.8 State3.9 Setup 與 TearDown3.10 Param3.11 CompilerControl 4. 示例代碼與分析4.1 關鍵點解讀…

2025年十大AI幻燈片工具深度評測與推薦

我來告訴你一個好消息。 我們已經親自測試和對比了市面上最優秀的AI幻燈片工具&#xff0c;讓你無需再為選擇而煩惱。 得益于AI技術的飛速發展&#xff0c;如今你可以快速制作出美觀、專業的幻燈片。 這些智能平臺的功能遠不止于配色美化——它們能幫你頭腦風暴、梳理思路、…

雪花算法:分布式ID生成的優雅解決方案

一、雪花算法的核心機制與設計思想 雪花算法&#xff08;Snowflake&#xff09;是由Twitter開源的分布式ID生成算法&#xff0c;它通過巧妙的位運算設計&#xff0c;能夠在分布式系統中快速生成全局唯一且趨勢遞增的ID。 1. 基本結構 雪花算法生成的是一個64位&#xff08;lo…

第1章:走進Golang

第1章&#xff1a;走進Golang 一、Golang簡介 Go語言&#xff08;又稱Golang&#xff09;是由Google的Robert Griesemer、Rob Pike及Ken Thompson開發的一種開源編程語言。它誕生于2007年&#xff0c;2009年11月正式開源。Go語言的設計初衷是為了在不損失應用程序性能的情況下…

Higress項目解析(二):Proxy-Wasm Go SDK

3、Proxy-Wasm Go SDK Proxy-Wasm Go SDK 依賴于 tinygo&#xff0c;同時 Proxy - Wasm Go SDK 是基于 Proxy-Wasm ABI 規范使用 Go 編程語言擴展網絡代理&#xff08;例如 Envoy&#xff09;的 SDK&#xff0c;而 Proxy-Wasm ABI 定義了網絡代理和在網絡代理內部運行的 Wasm …

NVMe IP現狀掃盲

SSD優勢 與機械硬盤&#xff08;Hard Disk Driver, HDD&#xff09;相比&#xff0c;基于Flash的SSD具有更快的數據隨機訪問速度、更快的傳輸速率和更低的功耗優勢&#xff0c;已經被廣泛應用于各種計算領域和存儲系統。SSD最初遵循為HDD設計的現有主機接口協議&#xff0c;例…

`docker commit` 和 `docker save`區別

理解 docker commit 和 docker save 之間的區別對于正確管理 Docker 鏡像非常重要。讓我們詳細解釋一下這兩個命令的作用及其區別。 1. docker commit 作用&#xff1a; docker commit roop-builder roop:v1 命令的作用是基于一個正在運行的容器 roop-builder 創建一個新的鏡…

Linux內核體系結構簡析

1.Linux內核 1.1 Linux內核的任務 從技術層面講&#xff0c;內核是硬件和軟件之間的一個中間層&#xff0c;作用是將應用層序的請求傳遞給硬件&#xff0c;并充當底層驅動程序&#xff0c;對系統中的各種設備和組件進行尋址。從應用程序的角度講&#xff0c;應用程序與硬件沒有…

python爬蟲:Ruia的詳細使用(一個基于asyncio和aiohttp的異步爬蟲框架)

更多內容請見: 爬蟲和逆向教程-專欄介紹和目錄 文章目錄 一、Ruia概述1.1 Ruia介紹1.2 Ruia特點1.3 安裝Ruia1.4 使用案例二、基本使用2.1 Request 請求2.2 Response - 響應2.3 Item - 數據提取2.4 Field 提取數據2.5 Spider - 爬蟲類2.6 Middleware - 中間件三、高級功能3.1 …

網絡攻防技術二:密碼學分析

文章目錄 一、傳統密碼分析方法1、根據明文、密文等信息的掌握情況分類 2、從密碼分析途徑分類二、密碼旁路分析1、概念2、旁路分析方法三、現代密碼系統1、對稱密碼&#xff08;單密鑰&#xff09;2、公開密碼&#xff08;成對密鑰&#xff09; 四、典型對稱密碼&#xff08;單…

Linux --TCP協議實現簡單的網絡通信(中英翻譯)

一、什么是TCP協議 1.1 、TCP是傳輸層的協議&#xff0c;TCP需要連接&#xff0c;TCP是一種可靠性傳輸協議&#xff0c;TCP是面向字節流的傳輸協議&#xff1b; 二、TCPserver端的搭建 2.1、我們最終好實現的效果是 客戶端在任何時候都能連接到服務端&#xff0c;然后向服務…

pc端小卡片功能-原生JavaScript金融信息與節日日歷

代碼如下 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>金融信息與節日日歷</title><…

C語言——獲取變量所在地址(uint8和uint32的區別)

前言&#xff1a; 1.使用uint8 *的原因 在C語言中&#xff0c;獲取或操作一個4字節地址&#xff08;指針&#xff09;時使用uint8_t*&#xff08;即unsigned char*&#xff09;而不是uint32_t*&#xff0c;主要基于以下關鍵原因&#xff1a; 1.1. 避免違反嚴格別名規則&…

Python----目標檢測(《YOLOv3:AnIncrementalImprovement》和YOLO-V3的原理與網絡結構)

一、《YOLOv3:AnIncrementalImprovement》 1.1、基本信息 標題&#xff1a;YOLOv3: An Incremental Improvement 作者&#xff1a;Joseph Redmon, Ali Farhadi 機構&#xff1a;華盛頓大學&#xff08;University of Washington&#xff09; 發表時間&#xff1a;2018年 代…

50天50個小項目 (Vue3 + Tailwindcss V4) ? | Form Wave(表單label波動效果)

&#x1f4c5; 我們繼續 50 個小項目挑戰&#xff01;—— FormWave組件 倉庫地址&#xff1a;https://github.com/SunACong/50-vue-projects 項目預覽地址&#xff1a;https://50-vue-projects.vercel.app/ &#x1f3af; 組件目標 構建一個美觀、動態的登錄表單&#xff0…