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  启动程序

 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐