第十二節: 總結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()方法控制調度的開啟 (必填)

    ③:Stop()方法控制調度的關閉 (必填)

    ④:Pause()方法暫停調度 (選填)

    ⑤:Continue()方法繼續調度 (選填)

    ⑥:Shutdown() 關閉 (需要支持)

  3. 在主程序中通過topshelf代碼調用: HostFactory.Run 詳見主程序。(在里面可以設置服務的名稱、描述等

  4. 通過指令進行服務發布和卸載(查看windows服務:services.msc)

   ①:通過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 QuartzService
 2     {
 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 =>                                 //1
 2                     {
 3                         x.Service<QuartzService>(s =>                        //2
 4                         {
 5                             s.ConstructUsing(name => new QuartzService());     //3
 6                             //開啟和關閉  必選項
 7                             s.WhenStarted(tc => tc.Start());              //4
 8                             s.WhenStopped(tc => tc.Stop());               //5
 9 
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的服務發布方式。

 

 

 


免責聲明!

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



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