Winform開發框架之通用定時服務管理


做項目的時候,或多或少需要和其他外部系統或者接口進行數據交互,有些是單向的獲取,有些可能是修改狀態后再寫回去,不管如何,這個都可以稱之為數據同步操作,如人員信息同步、業務數據同步、第三方接口數據同步等等。

數據同步涉及到一個同步時間的問題,一般不敏感的數據,一天或者一周左右同步一次就可以了,有些可能需要間隔更短一點。

同步的邏輯不同,有些可能寫數據庫就可以了,有些可能需要訪問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();
        }

調用進度測試的界面如下所示,它可以把各種同步詳細情況顯示在主界面上。

對於整個模塊的運行操作,我們通過日志進行記錄,這樣可以詳細看到具體的操作了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM