Topshelf+Quatz.Net的简单使用
程序员文章站
2023-11-14 10:30:40
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 启动程序