Topshelf+Quatz.Net的簡單使用 一 Topshelf概述 Topshelf是創建Windows服務的另一種方法,老外的一篇文章Create a .NET Windows Service in 5 steps with Topshelf通過5個步驟詳細的介紹使用使用Topshelf創建 ...
Topshelf+Quatz.Net的簡單使用
一 Topshelf概述
Topshelf是創建Windows服務的另一種方法,老外的一篇文章Create a .NET Windows Service in 5 steps with Topshelf通過5個步驟詳細的介紹使用使用Topshelf創建Windows 服務。Topshelf是一個開源的跨平臺的宿主服務框架,支持Windows和Mono,只需要幾行代碼就可以構建一個很方便使用的服務宿主。
二 Topshelf使用
1 新建Timer定時任務,併在Topshelf中使用
1 public class TownCrier 2 { 3 private readonly Timer timer; 4 public TownCrier() 5 { 6 timer = new Timer(1000) { AutoReset = true }; 7 timer.Elapsed += (sender,eventArgs) => Console.WriteLine($"It is {DateTime.Now} and all is well"); 8 } 9 public void Start() 10 { 11 timer.Start(); 12 } 13 public void Stop() 14 { 15 timer.Stop(); 16 } 17 18 } 19 20 static void Main(string[] args) 21 { 22 HostFactory.Run(x => 23 { 24 x.Service<TownCrier>(s => 25 { 26 s.ConstructUsing(name => new TownCrier()); 27 s.WhenStarted(tc => tc.Start()); 28 s.WhenStopped(tc => tc.Stop()); 29 }); 30 x.RunAsLocalSystem(); 31 x.SetDescription("QuartzNet任務調度服務,靈活配置任務計劃"); 32 x.SetDisplayName("QuartzJobShedule"); 33 x.SetServiceName("Quartz任務調度框架"); 34 } 35 ); 36 }
2 執行程式,正常運行,效果如下
三 Quartz.Net概述
在項目的開發過程中,難免會遇見後需要後臺處理的任務,例如定時發送郵件通知、後臺處理耗時的數據處理等,這個時候可以使用Quartz.Net。
Quartz.Net是純凈的,它是一個.Net程式集,是非常流行的Java作業調度系統Quartz的C#實現。
Quartz.Net是一款功能齊全的任務調度系統,從小型應用到大型企業級系統都能適用。功能齊全體現在觸發器的多樣性上面,即支持簡單的定時器,也支持Cron表達式;即能執行重覆的作業任務,也支持指定例外的日曆;任務也可以是多樣性的,只要繼承IJob介面即可。
對於小型應用,可以集成到你的系統中,對於企業級系統,它提供了Routing支持,提供了Group來組織和管理任務,此外還有持久化、插件功能、負載均衡和故障遷移等滿足不同應用場景的需要。
四 Quartz.Net使用
1 創建一個任務,繼承IJob介面
1 /// <summary> 2 /// 繼承IJob的一個任務 3 /// </summary> 4 public class HelloQuartzJob : IJob 5 { 6 public Task Execute(IJobExecutionContext context) 7 { 8 return Task.Factory.StartNew(() => 9 { 10 Console.WriteLine("Hello Quartz.Net"); 11 }); 12 } 13 }
2 在程式啟動時創建調度器(Scheduler),並添加HelloQuartzJob的調度
1 static async Task Main(string[] args) 2 { 3 //從工廠中獲取調度器實例 4 var scheduler = await StdSchedulerFactory.GetDefaultScheduler(); 5 6 //創建作業和觸發器 7 var jobDetail = JobBuilder.Create<HelloQuartzJob>().Build(); 8 var trigger = TriggerBuilder.Create() 9 .WithSimpleSchedule(m => 10 { 11 m.WithRepeatCount(10).WithIntervalInSeconds(1); 12 }) 13 .Build(); 14 15 Console.WriteLine($"任務調度器已啟動"); 16 17 //添加調度 18 await scheduler.ScheduleJob(jobDetail, trigger); 19 20 await scheduler.Start(); 21 Console.ReadKey(); 22 }
3 執行結果
五 Topshelf+Quartz.Net
1 創建Quartz的調度器類,實現Start和Stop方法
1 public class JobConfigure 2 { 3 private IScheduler scheduler; 4 5 public async Task GetJobConfigure() 6 { 7 //從工廠中獲取調度器實例 8 scheduler = await StdSchedulerFactory.GetDefaultScheduler(); 9 //創建作業和觸發器 10 var jobDetail = JobBuilder.Create<HelloQuartzJob>().Build(); 11 var trigger = TriggerBuilder.Create().WithSchedule(SimpleScheduleBuilder.RepeatSecondlyForever(1).WithRepeatCount(10)) 12 .Build(); 13 //添加調度 14 await scheduler.ScheduleJob(jobDetail, trigger); 15 } 16 17 public void Start() 18 { 19 this.GetJobConfigure().Wait(); 20 scheduler.Start(); 21 } 22 public void Stop() 23 { 24 scheduler.Shutdown(true); 25 } 26 27 }
2 在啟動程式中創建調度器(Scheduler),並添加JobConfigure的調度
1 static void Main(string[] args) 2 { 3 HostFactory.Run(x => 4 { 5 x.Service<JobConfigure>(s => 6 { 7 s.ConstructUsing(name => new JobConfigure()); 8 s.WhenStarted(tc => tc.Start()); 9 s.WhenStopped(tc => tc.Stop()); 10 }); 11 x.RunAsLocalSystem(); 12 x.SetDescription("QuartzNet任務調度服務,靈活配置任務計劃"); 13 x.SetDisplayName("QuartzJobShedule"); 14 x.SetServiceName("Quartz任務調度框架"); 15 } 16 ); 17 }
3 啟動程式