以前已經寫了兩篇關於自動升級系統OAUS的設計與實現的文章(第一篇、第二篇),在爲OAUS服務端增長自動檢測文件變動的功能(這樣每次部署版本升級時,能夠節省不少時間,並且能夠避免手動修改帶來的錯誤)後,有部分使用者又提出了一個很好的建議:爲OAUS增長斷點續傳功能。由於若是網絡狀態不是很好,就常常會在升級到一半的時候,因爲OAUS客戶端掉線而致使升級失敗,這個時候,就必須從新開始整個升級過程。即便升級中斷的時候,已經完成了99%,也必須重頭再來。因此,爲OAUS增長斷點續傳功能是很是必要的。html
如今,最新版本的OAUS已經增長了這個重要特性,當升級由於掉線而中斷的時候,OAUS客戶端並不會退出,而是一直嘗試斷線重連,重連成功後,就會從上次中斷的地方繼續升級。以下圖所示: api
在網絡狀態極差時,可能在一次升級的過程當中,會出現屢次斷線重連的狀況,這都不要緊,OAUS客戶端會一直正常工做,直到整個升級過程完成爲止。 網絡
下面簡單說明一下代碼實現的具體過程,OAUS斷點續傳功能是在客戶端實現的,服務端不須要作任何修改。this
1.預約網絡鏈接斷開的事件,獲得掉線通知。此時,須要記錄是在升級第幾個文件的時候,升級中斷的。spa
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增長斷點續傳功能時,就不須要再次實現與斷點續傳相關的繁瑣的業務邏輯了。code
3. 如何使用OAUS升級機制的說明orm
通常而言,若是最新客戶端程序與老版本兼容,不升級也影響不大,則能夠交由用戶決定是否升級;若是最新客戶端程序不兼容老版本,或者是有重大更新,則將啓動強制升級。若是流程要進入啓動升級,那麼只要啓動AutoUpdater的文件夾下AutoUpdater.exe就能夠了。要注意的是,啓動AutoUpdater.exe進程後,要退出當前的客戶端進程,不然,有些文件會由於沒法被覆蓋而致使更新失敗。代碼大體以下所示: htm
if (VersionHelper.HasNewVersion(oausServerIP,oausServerPort)) { string updateExePath = AppDomain.CurrentDomain.BaseDirectory + "AutoUpdater\\AutoUpdater.exe"; System.Diagnostics.Process myProcess = System.Diagnostics.Process.Start(updateExePath); ......//退出當前進程 }
1.自動升級系統OAUS - 源碼blog
若是有任何建議或問題,請留言給我。