做項目的時候,或多或少需要和其他外部系統或者接口進行數據交互,有些是單向的獲取,有些可能是修改狀態后再寫回去,不管如何,這個都可以稱之為數據同步操作,如人員信息同步、業務數據同步、第三方接口數據同步等等。
數據同步涉及到一個同步時間的問題,一般不敏感的數據,一天或者一周左右同步一次就可以了,有些可能需要間隔更短一點。
同步的邏輯不同,有些可能寫數據庫就可以了,有些可能需要訪問WebService或者其他接口,然后在進行數據獲取,保存等操作,回寫的時候,也一般是調用WebService這樣的接口修改數據。
每個同步實現我們都需要做大量重復性工作,如Windows服務安裝、卸載、或者基礎性的工作,有沒有一種方式可以隔離業務邏輯和常用的東西呢?
1、通用定時服務管理模塊設計
這樣的同步操作看似沒有很多必然的關聯性,但是,這些都是很常見的東西,如果以插件架構方式來組織各個不同的業務封裝,通過參數配置實現同步間隔不同,核心的同步模塊其實是很多類似的東西,而同步一般通過Windows訪問進行,這樣通用的我們可以把它封裝成一個通用的Windows服務。再輔以一個界面管理模塊來管理服務的安裝、卸載、啟動、停止、測試等操作就可以了,整個Window服務的插件設計框架如下所示。
Windows定時服務-文件視圖如下所示:
以上架構,有幾個特點,
1、 基於插件結構,擴展容易。
2、 一個定時服務【通用的WIndows服務模塊】,可以同時運行很多個不同的定時規則的定時服務應用。
3、 一個通用的服務管理界面【Windows定時服務管理】,來對定時服務的安裝、卸載、啟動、停止、測試等操作,並且可以對插件進行可視化配置。
4、【通用的WIndows服務模塊】提供參數化安裝,卸載、測試的功能。
5、【Windows定時服務管理】提供DOS測試和WInform進度測試的集成。
6、 插件參數化配置,提供插件各種參數的配置,統一調度。
6、插件通過反射加載不同的定時服務應用,實現松耦合和強類型接口的轉換,確保彈性化和安全性。
7、整個定時服務管理模塊,可以在不同的場合下實現重用,每次只是定時服務應用的不同而已。
8、定時時間設置,提供多樣化的設置,可以在間隔時間、每天整點運行、每月指定日期時間運行多種方式。
整個定時服務管理通用模塊,可以最大化的實現工具重用、邏輯重用,不管業務場景如何變化,基本上不需要調整了,只需要把定時服務應用ABC模塊開發好,參數配置好,丟進去就可以了。
2、定時服務控制台【Windows定時服務管理】的界面設計
開發好的【Windows定時服務管理】界面如下所示,運行后,會把XML文檔里面的插件加載在下面的列表中,供查看和修改操作。
插件的XML配置信息如下所示。
<?xml version="1.0"?> <ArrayOfPlugInSetting> <PlugInSetting> <!--插件程序名稱--> <Name>測試名稱</Name> <!--插件描述內容--> <Description>測試描述</Description> <!--運行同步服務的間隔時間(單位:分鍾)--> <ServiceCycleMinutes>1</ServiceCycleMinutes> <!--Windows服務在固定時刻(0~23時刻)運行--> <ServiceRunAtHour>23</ServiceRunAtHour> <!--Windows服務在每月指定天運行,小時按ServiceRunAtHour的值--> <ServiceRunAtDay>1</ServiceRunAtDay> <!--運行模式,0為間隔分鍾運行 1為固定時刻運行, 2為按月某天和小時 其他值為禁用--> <RunMode>0</RunMode> <!--插件的類型名稱:插件類名,程序集名稱--> <PlugInTypeName>WHC.PlugInService.ClassName,WHC.PlugInService</PlugInTypeName> </PlugInSetting> </ArrayOfPlugInSetting>
單擊安裝服務,控制台程序調用DOS命令+參數來實現通用定時WIndows服務的安裝。
安裝后,系統的Windows服務列表中就會增加一個【定時服務】的服務模塊了,這樣就證明我們順利安裝了通用定時服務了。
定時服務控制台的狀態也會同時刷新,並且把服務的狀態和類型顯示在【服務狀態】里面,這個時候,可以對服務進行卸載、測試、停止服務、重新啟動、刷新狀態等相關操作了。
如果對於很多定時服務應用,每種需要進行動態的禁用或者設置定時方式,那么可以在列表上右鍵進行相關的操作。
3、定時應用測試及界面集成
在開發過程中,發現經常性的需要調試我們自己的定時應用ABC是否正確生成,可以通過【DOS測試】和【進度測試】這兩個按鈕進行邏輯測試,這個沒有觸發Windows的情況下進行調用,可以看到具體的效果如下所示。
一般來說,提供以上DOS窗口來進行跟蹤調試就可以了,但是有時候,我們想在Winform程序中調用立即同步的操作的時候,可以使用進度測試的邏輯代碼進行處理,這樣可以在主界面中顯示進度。
由於是插件架構,因此在和Winform集成的時候,其實是和這個定時服務控制台一樣,我們在我們的Winform程序中,加載應用插件,進行調用就可以了,調用代碼如下所示。
private void btnTestProgress_Click(object sender, EventArgs e) { try { this.lblTips.Visible = true; this.progressBar1.Visible = true; //Winform進度條指示測試 foreach (string key in pluginList.Keys) { ITimingPlugIn obj = pluginList[key]; if (obj != null) { obj.ProgressChanged += new ProgressChangedEventHandler(TimingPlugIn_ProgressChanged); obj.Excute(); LogTextHelper.Info(string.Format("插件【{0}】運行一次", key)); } } MessageUtil.ShowTips("操作完成"); } finally { lblTips.Text = ""; this.lblTips.Visible = false; this.progressBar1.Visible = false; } } void TimingPlugIn_ProgressChanged(object sender, ProgressChangedEventArgs e) { //ITimingPlugIn obj = sender as ITimingPlugIn; progressBar1.Value = e.ProgressPercentage; if (e.UserState != null) { lblTips.Text = e.UserState.ToString(); } Thread.Sleep(100); Application.DoEvents(); }
調用進度測試的界面如下所示,它可以把各種同步詳細情況顯示在主界面上。
對於整個模塊的運行操作,我們通過日志進行記錄,這樣可以詳細看到具體的操作了。