第十二节: 总结Quartz.Net几种部署模式(IIS、Exe、服务部署【借助TopSelf、服务类】)
一.?IIS部署
比如在MVC框架中集成了Quartz.Net定時調度,此時該調度系統會隨著MVC框架被掛在IIS下,IIS會進程回收,所以大部分開發都會遇到Quartz掛在IIS下一段時間不好用。
補充:IIS可以設置定時自動回收,默認回收是1740分鐘,也就是29小時。IIS自動回收相當于服務器IIS重啟,應用程序池內存清空,所有數據被清除,相當于IIS重啟,在度量快速開發平臺服務器端,為了減小數據庫負擔,內存中暫存了很多信息,不適合頻繁的回收,因為回收會造成服務器端所有存在內存中的數據丟失,如果沒有及時保存到數據庫中,可能導致程序出現問題。而如果系統使用高峰時期,并不適合回收,回收可能導致幾十秒IIS無響應,對于正在工作的人員來說,是一種很不好的體驗,會以為是網絡或者掉線等問題。
解決方案:關閉該項目在IIS上對應的進程池的回收機制。
如何關閉進程池的回收機制:選中IIS中部署的項目對應的進程池,點擊【高級設置】,里面有5個核心參數:
?、?發生配置更改時禁止回收:如果為True,應用程序池在發生配置更改時將不會回收。
?、?固定時間間隔(分鐘):超過設置的時間后,應用程序池回收,設置為:0 意味著應用程序池不回收。系統默認設置的時間是1740(29小時)。
?、?禁用重疊回收:如果為true,將發生應用程序池回收,以便在創建另一個工作進程之前退出現有工作進程
④ 請求限制:應用程序池在回收之前可以處理的最大請求數。如果值為0,則表示應用程序池可以處理的請求數沒有限制。
?、?生成回收事件日志條目:每發生一次指定的回收事件時便產生一個事件日志條目。
? ?總結:即使可以將IIS進程池回收關掉,仍然不建議把Quartz掛到IIS下,長時間不回收,會存在內存溢出的問題。
?
二. C/S程序直接運行
我們可以用控制臺的形式或者Winform的形式單獨做一套定時調度系統,與主框架分類,也便于維護,可以直接將exe程序或者Winform窗體程序在服務器上運行。
總結:該方法不存在回收的問題,但直接在服務器上運行,容易不小心被運維人員關掉了。
對于專業一點的人員來說,該方案,直接運行程序太Low了,所以通常是將exe程序發不成windows服務,通過服務的開啟和關閉來?維護。
?
三.?借助topshelf來進行的windows服務部署?
官網:http://topshelf-project.com/ , 這是一種通用的發布服務的方式,步驟如下:
1. 通過NuGet下載 Topshelf 的程序集
2. 配置QuartzService類,充當定時任務的服務端程序
①:構造函數中執行定時調度任務
②:Start()方法控制調度的開啟 (必填)
?、?#xff1a;Stop()方法控制調度的關閉 (必填)
④:Pause()方法暫停調度 (選填)
⑤:Continue()方法繼續調度 (選填)
?、?#xff1a;Shutdown() 關閉 (需要支持)
3. 在主程序中通過topshelf代碼調用: HostFactory.Run 詳見主程序。(在里面可以設置服務的名稱、描述等)
4. 通過指令進行服務發布和卸載(查看windows服務:services.msc)
?、?#xff1a;通過cmd命令定位到bin文件目錄下(以管理員身份運行)
(eg: 先輸入 d: 切換到D盤,再執行下面的命令??cd D:\06-我的開發之路\DotNet體系\04-DotNet專題篇\01-Quartz.Net定時調度\01-Code\MyQuarzt\QuartzDemo\bin\Debug??)
②:QuartzDemo.exe help: 查看指令
QuartzDemo.exe install: 安裝服務
QuartzDemo.exe install start : 安裝服務且開啟
QuartzDemo.exe uninstall :卸載服務
截止此處,大功告成,可以看到D盤中多了一個txt文件,每隔3s多一條數據
?下面分享整個過程的代碼部署的相應截圖:
?(1). Quartz代碼和TopSelf調用代碼:
1 public class QuartzService2 {3 IScheduler scheduler = null;4 /// <summary>5 /// 定時調度業務6 /// </summary>7 public QuartzService()8 {9 //1.創建作業調度池(Scheduler) 10 scheduler = StdSchedulerFactory.GetDefaultScheduler(); 11 12 //2.創建一個具體的作業即job (具體的job需要單獨在一個文件中執行) 13 var job = JobBuilder.Create<HelloJob5>().Build(); 14 15 //3.創建并配置一個觸發器即trigger 3s執行一次 16 var trigger = TriggerBuilder.Create().WithSimpleSchedule(x => x.WithIntervalInSeconds(3) 17 .RepeatForever()).Build(); 18 //4.將job和trigger加入到作業調度池中 19 scheduler.ScheduleJob(job, trigger); 20 } 21 /// <summary> 22 /// 開啟任務 23 /// </summary> 24 public void Start() 25 { 26 scheduler.Start(); 27 } 28 /// <summary> 29 /// 關閉任務 30 /// </summary> 31 public void Stop() 32 { 33 //true:表示該Sheduler關閉之前需要等現在所有正在運行的工作完成才能關閉 34 //false:表示直接關閉 35 scheduler.Shutdown(true); 36 } 37 /// <summary> 38 /// 暫停調度 39 /// </summary> 40 public void Pause() 41 { 42 scheduler.PauseAll(); 43 } 44 /// <summary> 45 /// 繼續調度 46 /// </summary> 47 public void Continue() 48 { 49 scheduler.ResumeAll(); 50 } 51 52 } 1 HostFactory.Run(x => //12 {3 x.Service<QuartzService>(s => //24 {5 s.ConstructUsing(name => new QuartzService()); //36 //開啟和關閉 必選項7 s.WhenStarted(tc => tc.Start()); //48 s.WhenStopped(tc => tc.Stop()); //59 10 // optional pause/continue methods if used 11 // 暫停和繼續 選填 12 s.WhenPaused(tc => tc.Pause()); 13 s.WhenContinued(tc => tc.Continue()); 14 15 optional, when shutdown is supported 16 //s.WhenShutdown(tc => tc.Shutdown()); 17 18 }); 19 x.RunAsLocalSystem(); //6 20 x.SetDescription("測試借助TopSelf將Quartz發布成服務"); //7 21 x.SetDisplayName("QuartzService"); //8 22 x.SetServiceName("QuartzService2"); //9 23 });(2). 定位到指定路徑,并進行相應的服務部署
a. 很多指令
b. 安裝服務并開啟
?
查看服務列表:
?
查看服務運行結果:
?
刪除服務:
?
?
三. 借助window服務類
? 這里不詳細介紹(網上一堆一堆的),推薦采用上面的TopShelf的服務發布方式。
?
總結
以上是生活随笔為你收集整理的第十二节: 总结Quartz.Net几种部署模式(IIS、Exe、服务部署【借助TopSelf、服务类】)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ABP入门系列(21)——切换MySQL
- 下一篇: L2自动驾驶事故特斯拉独占七成!马斯克: