windows服務+定時任務(quartz.net)+nancy


需求一:軟件要能在操作系統啟動后,自動運行
因為操作系統是windows 10,所以最先想到的是windows服務,因為windows服務有個自動啟動選項,設為true就行了。
.net做這個最合適了,可以建windows服務項目。


需求二:包含N個任務,要求每天、每周、每月都可以執行,時間可自己設置
面對這個需求,很明顯Timer不適合了,最先想到的便是Quartz.net,因為這個東西之前也用過,所以就用它了。滿足需求綽綽有余。
有一點需要說明的是,具體時間是保存在數據庫里面的,服務在從數據庫讀取到時間后,還需要將設置的時間轉換成cron表達式。


需求三:領導說你能在這個windows服務里面提供web api嗎?這樣就不用單獨的再創建一個接口項目了。
一開始想用HttpListener自己寫個簡單的http web服務器,畢竟接口就一個。
但是后來想到這種東西應該有別人寫好的吧,所以就百度了下,發現Nancy比較合適。使用它可以監聽指定端口,提供web服務。
而且,我是通過job將最終需要執行的消息放在隊列里面,然后去消費隊列。沒有用第三方的隊列,用的是ConcurrentQueue。
所以如果另外建web項目,就屬於兩個不同的項目,沒辦法消費隊列了。


注意:在服務停止后,需要關閉后台運行的線程,不然服務雖然停止了,但是未執行完的代碼依然還會執行。

        /// <summary>
        /// 關閉相關后台線程,使得服務結束時,線程也關閉
        /// </summary>
        protected override void OnStop()
        {
            //關閉quartz
            if (!_scheduler.IsShutdown)
            {
                _scheduler.Shutdown();
                _logger.Info("quartz scheduler has shutdown");
            }

            //關閉http server
            if (_nancyHost != null)
            {
                _nancyHost.Stop();
                _logger.Info("http server has stoped");
            }

            //關閉socket檢測
            this._checkSocketTimer.Dispose();
            _logger.Info("_checkSocketTimer has disposed");
        }

特此記下解決方案,以備后用。


免責聲明!

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



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