当前位置: 首页 > news >正文

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

一.缘起    

  之前已经写了两篇关于自动升级系统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 - 使用手册

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

相关文章:

  • Dom4j递归输出所有的接点和值
  • 数据预处理
  • 流控PANABIT 12在ESX里安装小结
  • Oracle的oci和thin的不同
  • 几个 vim 的块操作命令
  • Android进阶:打jar包获取assets中的资源 解决selector XML文件不能解...
  • 模拟实现兼容低版本IE浏览器的原生bind()函数功能
  • oracle中exp,imp(导入,导出)的使用详解
  • 【原创】erlang 模块之 rpc
  • Extreme交换机基本配置-账号软件升级密码配置
  • 使用mysqldump导入导出含BOLB数据的表
  • root logger默认的level是logging.WARNING
  • Prime Path
  • vim配色方案colorscheme设置
  • JAVA图形界面(GUI)之菜单
  • Angular 响应式表单之下拉框
  • Cookie 在前端中的实践
  • JavaScript函数式编程(一)
  • maven工程打包jar以及java jar命令的classpath使用
  • php的插入排序,通过双层for循环
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • SwizzleMethod 黑魔法
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • vue:响应原理
  • 多线程事务回滚
  • 分布式熔断降级平台aegis
  • 简单实现一个textarea自适应高度
  • 如何设计一个微型分布式架构?
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 学习JavaScript数据结构与算法 — 树
  • 一些css基础学习笔记
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • #微信小程序:微信小程序常见的配置传旨
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (二)windows配置JDK环境
  • (分布式缓存)Redis持久化
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (三)模仿学习-Action数据的模仿
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (四) 虚拟摄像头vivi体验
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • (轉貼) UML中文FAQ (OO) (UML)
  • .Net CF下精确的计时器
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .NET处理HTTP请求
  • .NET多线程执行函数
  • .NET分布式缓存Memcached从入门到实战
  • [ HTML + CSS + Javascript ] 复盘尝试制作 2048 小游戏时遇到的问题
  • [Android 数据通信] android cmwap接入点
  • [ArcPy百科]第三节: Geometry信息中的空间参考解析
  • [AutoSar]BSW_Memory_Stack_004 创建一个简单NV block并调试
  • [C#]扩展方法