windows 服務實現定時任務調度(Quartz.Net)

咱們一般在一些狀況下須要軟件具備一個自動執行某些任務的功能,可是又不但願直接啓動軟件,或者每次都要手動的來啓動軟件,這時咱們可能夠考慮到windows服務了。html

首先建立一個windows服務項目(詳細信息請參閱:C#建立Windows Service(Windows 服務)基礎教程spring

    

在建立好的項目中點擊「單擊此處切換到代碼視圖」切換到代碼windows

咱們主要關注一下兩個方法:網絡

  • OnStart – 控制服務啓動
  • OnStop – 控制服務中止框架

  例:ide

 1     public partial class Service1 : ServiceBase
 2     {
 3         public Service1()
 4         {
 5             InitializeComponent();
 6         }
 7 
 8         protected override void OnStart(string[] args)
 9         {
10             //todo:這裏是服務啓動所執行的代碼
11         }
12 
13         protected override void OnStop()
14         {
15             //todo:這裏是服務中止所執行的代碼
16         }
17     }
View Code

 下面咱們能夠寫一個定時任務的功能了:post

  

 1      private void StartDoSomething()
 2         {
 3             System.Timers.Timer timer = new System.Timers.Timer(10000); //間隔10秒
 4             timer.AutoReset = true;
 5             timer.Enabled = false;  //執行一次
 6             timer.Elapsed += new ElapsedEventHandler(ExecutionCode);
 7             timer.Start();
 8         }
 9 
10         private void ExecutionCode(object source, System.Timers.ElapsedEventArgs e)
11         {
12             string dtNow = DateTime.Now.ToString("HH:mm");
13             if (dtNow == "12:00")
14             {
15                 File.WriteAllText("D:/ExecutionService.txt", "服務執行了一次任務", Encoding.UTF8);
16             }
17         }

而後在OnStart的方法中調用上面的StartDoSomething的方法網站

1         protected override void OnStart(string[] args)
2         {
3             StartDoSomething();
4         }    

以上就能夠算是一個簡單的定時執行任務的windows服務了,這裏咱們還可使用Quartz.Net來實現更增強大的任務調度功能。ui

 

首先來介紹一下Quartz.Net這個框架:url

  簡介:Quartz.Net是一個開源的任務調度框架,很是強大,可以經過簡單的配置幫助咱們定時具體的操做。相對於咱們用的線程裏面while(true)而後sleep來執行某個操做,應該算的上是高端,大氣,上檔次了。目前最新版本是2.2,新的版本里面有些方法名發生了變化,從以前的版本用過來的人應該會有體會.這裏我使用最經常使用,也是最穩定的方式--Windows服務裏面使用Quartz.net,而且使用配置的方式來設置觸發器。(以上內容摘自網絡)

  簡單的理解就是它可以幫咱們定時的作事,至關於鬧鐘可以叫咱們起牀同樣。

  目前最新的版本是Quartz.NET 2.2.3 你們能夠在這裏下載

 

  如今咱們須要在剛剛建立的服務項目中引用以下文件:

    

  在配置文件中寫好本身的配置(本例子演示定時訪問指定網站)

 1 <?xml version="1.0"?>
 2 <configuration>
 3   <configSections>
 4     <sectionGroup name="JobList">
 5       <section name="Job" type="MyService1101.MyConfigHandler,MyService1101"/>
 6     </sectionGroup>
 7   </configSections>
 8   <startup>
 9     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
10   </startup>
11   <JobList>
12     <Job>   <!--這裏是一個任務節點-->
13       <add key="Url" value="http://www.baidu.com" />  <!--須要訪問的Url-->
14       <add key="Hour" value="10" />   <!--開始時間小時,注意:這裏的小時爲0-23,若是是1點的話就是1,而不是01-->
15       <add key="Minute" value="30"/>    <!--開始時間分鐘,注意:同上0-59-->
16     </Job>
17   </JobList>
18 </configuration>
View Code

 

  新建一個MyConfigHandler.cs類來讀取自定義配置節點

 1 public class MyConfigHandler : IConfigurationSectionHandler
 2     {
 3         public MyConfigHandler()
 4         {
 5         }
 6 
 7         public object Create(object parent, object configContext, System.Xml.XmlNode section)
 8         {
 9             NameValueCollection configs;
10             NameValueSectionHandler baseHandler = new NameValueSectionHandler();
11             configs = (NameValueCollection)baseHandler.Create(parent, configContext, section);
12             return configs;
13         }
14     }
View Code

 

  而後新建一個SystemScheduler類來建立調度程序

 1     public class SystemScheduler
 2     {
 3         private SystemScheduler()
 4         {
 5         }
 6 
 7         public static SystemScheduler CreateInstance()
 8         {
 9             return new SystemScheduler();
10         }
11 
12         private IScheduler _scheduler;
13 
14         public void StartScheduler()
15         {
16             //這裏讀取配置文件中的任務開始時間
17             int hour = int.Parse(((NameValueCollection)ConfigurationSettings.GetConfig("JobList/Job"))["Hour"]);
18             int minute = int.Parse(((NameValueCollection)ConfigurationSettings.GetConfig("JobList/Job"))["Minute"]);
19 
20             ISchedulerFactory schedulerFactory = new StdSchedulerFactory();//內存調度
21             _scheduler = schedulerFactory.GetScheduler();
22 
23             //建立一個Job來執行特定的任務
24             IJobDetail synchronousData = new JobDetailImpl("SynchronousData", typeof(SynchronousData));
25             //建立並定義觸發器的規則(天天執行一次時間爲:時:分)
26             ITrigger trigger =
27                 TriggerBuilder.Create()
28                     .WithDailyTimeIntervalSchedule(
29                         a => a.WithIntervalInHours(24).OnEveryDay().StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(hour, minute))).Build();
30             //將建立好的任務和觸發規則加入到Quartz中
31             _scheduler.ScheduleJob(synchronousData, trigger);
32             //開始
33             _scheduler.Start();
34         }
35 
36         public void StopScheduler()
37         {
38             _scheduler.Shutdown();
39         }
40     }
View Code

 

  新建一個SynchronousData類,讓其實現IJob接口來實現SystemScheduler中自定義的任務

 1     public class SynchronousData : IJob
 2     {
 3         public void Execute(IJobExecutionContext context)
 4            {
 5             string Url = ((NameValueCollection)ConfigurationSettings.GetConfig("JobList/Job"))["Url"];
 6             WebClient wc = new WebClient();
 7             WebRequest wr = WebRequest.Create(new Uri(Url));
 8             using (StreamWriter sw = File.AppendText(@"d:\SchedulerService.txt"))
 9             {
10                 sw.WriteLine("------------------" + "MyService服務在:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "     執行了一次任務" + "------------------");
11                 sw.Flush();
12             }
13         }
14     }
View Code

 

  最後在OnStart中添加對這個調度程序的應用

1         protected override void OnStart(string[] args)
2         {
3             SystemScheduler _systemScheduler = SystemScheduler.CreateInstance();
4             _systemScheduler.StartScheduler();
5         }   

 

  程序生成後咱們能夠經過指令安裝它

  安裝完成後在服務中會有一個新的服務項

  

  程序運行事後會在D:盤生成一個SchedulerService.txt文件

  

 

  本程序源碼:下載

 

     2. Quartz 定時器時間設置

     http://www.360doc.com/content/11/1017/10/1542811_156808468.shtml

 
 
 
Quartz
spring定時器的時間設置
 
時間的配置以下:<value>0 26 16 * * ?</value> 
 
時間大小由小到大排列,從秒開始,順序爲 秒,分,時,天,月,年    *爲任意 ?爲無限制。 由此上面所配置的內容就是,在天天的16點26分啓動buildSendHtml() 方法
 
具體時間設定可參考
"0/10 * * * * ?" 每10秒觸發
"0 0 12 * * ?" 天天中午12點觸發 
"0 15 10 ? * *" 天天上午10:15觸發 
"0 15 10 * * ?" 天天上午10:15觸發 
"0 15 10 * * ? *" 天天上午10:15觸發 
"0 15 10 * * ? 2005" 2005年的天天上午10:15觸發 
"0 * 14 * * ?" 在天天下午2點到下午2:59期間的每1分鐘觸發 
"0 0/5 14 * * ?" 在天天下午2點到下午2:55期間的每5分鐘觸發 
"0 0/5 14,18 * * ?" 在天天下午2點到2:55期間和下午6點到6:55期間的每5分鐘觸發 
"0 0-5 14 * * ?" 在天天下午2點到下午2:05期間的每1分鐘觸發 
"0 10,44 14 ? 3 WED" 每一年三月的星期三的下午2:10和2:44觸發 
"0 15 10 ? * MON-FRI" 週一至週五的上午10:15觸發 
"0 15 10 15 * ?" 每個月15日上午10:15觸發 
"0 15 10 L * ?" 每個月最後一日的上午10:15觸發 
"0 15 10 ? * 6L" 每個月的最後一個星期五上午10:15觸發 
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每個月的最後一個星期五上午10:15觸發 
"0 15 10 ? * 6#3" 每個月的第三個星期五上午10:15觸發
0 0 06,18 * * ?  在天天上午6點和下午6點觸發 
0 30 5 * * ? *   在天天上午5:30觸發
0 0/3 * * * ?    每3分鐘觸發
相關文章
相關標籤/搜索