自动升级系统的设计与实现(续2) -- 增加断点续传功能 (附最新源码)

简介: 一.缘起       之前已经写了两篇关于自动升级系统OAUS的设计与实现的文章(第一篇、第二篇),在为OAUS服务端增加自动检测文件变更的功能(这样每次部署版本升级时,可以节省很多时间,而且可以避免手动修改带来的错误)后,有部分使用者又提出了一个很好的建议:为OAUS增加断点续传功能。

一.缘起    

  之前已经写了两篇关于自动升级系统OAUS的设计与实现的文章(第一篇第二篇),在为OAUS服务端增加自动检测文件变更的功能(这样每次部署版本升级时,可以节省很多时间,而且可以避免手动修改带来的错误)后,有部分使用者又提出了一个很好的建议:为OAUS增加断点续传功能。因为如果网络状态不是很好,就经常会在升级到一半的时候,由于OAUS客户端掉线而导致升级失败,这个时候,就必须重新开始整个升级过程。即使升级中断的时候,已经完成了99%,也必须重头再来。所以,为OAUS增加断点续传功能是非常必要的。

  现在,最新版本的OAUS已经增加了这个重要特性,当升级因为掉线而中断的时候,OAUS客户端并不会退出,而是一直尝试断线重连,重连成功后,就会从上次中断的地方继续升级。如下图所示:       

     

      

  在网络状态极差时,可能在一次升级的过程中,会出现多次断线重连的情况,这都没关系,OAUS客户端会一直正常工作,直到整个升级过程完成为止。 

二.源码实现

  下面简单说明一下代码实现的具体过程,OAUS断点续传功能是在客户端实现的,服务端不需要做任何修改。

1.预定网络连接断开的事件,得到掉线通知。此时,需要记录是在升级第几个文件的时候,升级中断的。

2.预定重连成功时间,得到网络链接恢复的通知。此时,开始重新下载下一个需要升级的文件。

    void rapidPassiveEngine_RelogonCompleted(LogonResponse res)
    {
        if (res.LogonResult == LogonResult.Succeed)
        {               
            this.DownloadNextFile();
            this.logger.LogWithTime("重连成功,开始续传!");
            if (this.UpdateContinued != null)
            {
                this.UpdateContinued();
            }

            return;
        }        
    }
    private void DownloadNextFile()
    {
        if (this.haveUpgradeCount >= this.fileCount)
        {
            return;
        }

        DownloadFileContract downLoadFileContract = new DownloadFileContract();
        downLoadFileContract.FileName = this.downLoadFileRelativeList[this.haveUpgradeCount];
        //请求下载下一个文件
        this.rapidPassiveEngine.CustomizeOutter.Send(InformationTypes.DownloadFiles, CompactPropertySerializer.Default.Serialize(downLoadFileContract));               
    }

  加上以上的逻辑处理之后,OAUS就已经具备了断点续传的功能了。代码看起来非常简单,那是因为内部核心的文件传送功能、断点续传功能都由ESFramework封装好了。在为OAUS增加断点续传功能时,就不需要再次实现与断点续传相关的繁琐的业务逻辑了。

3. 如何使用OAUS升级机制的说明

  一般而言,如果最新客户端程序与老版本兼容,不升级也影响不大,则可以交由用户决定是否升级;如果最新客户端程序不兼容老版本,或者是有重大更新,则将启动强制升级。如果流程要进入启动升级,那么只要启动AutoUpdater的文件夹下AutoUpdater.exe就可以了。要注意的是,启动AutoUpdater.exe进程后,要退出当前的客户端进程,否则,有些文件会因为无法被覆盖而导致更新失败。代码大致如下所示: 

  if (VersionHelper.HasNewVersion(oausServerIP,oausServerPort)) 
  {      
       string updateExePath = AppDomain.CurrentDomain.BaseDirectory + "AutoUpdater\\AutoUpdater.exe";   
       System.Diagnostics.Process myProcess = System.Diagnostics.Process.Start(updateExePath);     
       ......//退出当前进程  
  } 

三.相关下载

1.自动升级系统OAUS - 源码

2.自动升级系统OAUS(可直接部署)

3.自动升级系统OAUS - 使用手册

  如果有任何建议或问题,请留言给我。

目录
相关文章
疲劳检测-闭眼检测(详细代码教程)
疲劳检测-闭眼检测(详细代码教程)
|
SQL 关系型数据库 PostgreSQL
PostgreSQL 浮点数类型
PostgreSQL 浮点数类型
3447 0
|
Python
Python中遇到奇怪的错误ValueError: bad marshal data
不是代码出的问题,是*.pyc文件被改动了。解决方法,删除所有*.pyc文件再运行
5525 0
|
域名解析 Ubuntu Linux
Docker 镜像基本操作
本文介绍 Docker 镜像最常用的三个基本操作 login、pull、push以及如何登录子账户。通过认识镜像的基本操作,您可以更熟练地使用容器镜像服务 ACR。
9125 0
Docker 镜像基本操作
|
9月前
|
机器学习/深度学习 并行计算 测试技术
ONNX Runtime Python 推理性能优化:8 个低延迟工程实践
深度学习推理慢?未必是模型问题。本文揭示8大ONNX Runtime工程优化技巧:合理选择执行提供器、精准控制线程、规避内存拷贝、固定Shape分桶、启用图优化、CPU量化加速、预热与微批处理、向量化前后处理。不改模型也能显著提升性能,低延迟落地关键在于细节调优。
668 0
|
JSON 数据可视化 API
GraphRAG+Ollama,构建本地精准全局问答系统!
RAG 是目前大语言模型相关最知名的工具之一,从外部知识库中检索事实,以便为大型语言模型 (LLM) 提供最准确、最新的信息。
|
11月前
|
存储 机器学习/深度学习 缓存
85_多轮对话:上下文管理与压缩
在大语言模型(LLM)的应用场景中,多轮对话已经成为最核心的交互模式之一。随着2025年LLM技术的快速发展,用户对持续、连贯、个性化的对话体验要求越来越高。然而,多轮对话面临着严峻的技术挑战:首先,LLM的上下文窗口长度虽然在不断扩展(如GPT-5已支持100K tokens),但依然是有限资源;其次,随着对话轮次增加,历史信息不断累积,导致token消耗激增;第三,过长的上下文可能导致模型对早期信息的关注度下降,影响回复质量。
2150 1
|
敏捷开发 测试技术 BI
禅道:从安装到使用,一篇文章带你全面了解
禅道:从安装到使用,一篇文章带你全面了解
3760 3
|
算法 Linux 调度
Docker的资源限制实战篇
本文详细介绍了如何利用Docker对容器的资源进行限制,包括内存和CPU的使用。文章首先概述了资源限制的重要性及其在Linux系统中的实现原理,并强调了不当设置可能导致的风险。接着,通过一系列实战案例展示了如何具体设置容器的内存限制,包括硬性限制、动态调整以及软限制等。最后,文章还提供了限制容器CPU访问的具体方法和示例,如指定容器使用的CPU核心数和基于`--cpu-shares`参数对CPU资源进行分配。通过这些实践,读者可以更好地理解和掌握Docker资源管理技巧。
1676 14
Docker的资源限制实战篇
|
Docker 容器
docker的导入本地镜像和导出本地镜像
本文介绍了如何使用Docker对本地镜像进行导入和导出操作,包括从本地导入`nginx.tar`镜像以及将`open-webui`镜像导出并压缩为`open-webui.tar.gz`。
2058 1