需求
在处理定时任务大家可能都用过Quartz.NET,但在生产环境中大家肯定也遇到过如下的问题:
- 发布的时候需要停掉所有的Job,再整个一起打包发布
- 没有管理界面(其实在github也有几个这方面的项目,如:CrystalQuartz),不能很好的做到实时监控。
由于在生产环境中有以上的问题,所以我抽空就写了一个基于Quartz.NET的QuartzService。
原理
因为Quartz.NET中,任务的管理是其于线程的,所以在管理Job的时候并不能将Job隔离开来,所以才有了问题一。在QuartzService中我采用的是进程的方式进行管理。即一个执行程序包含一个Scheduler与一个Job,这样就对任务进行了隔离,但这也意味着更大的资源消耗。对此我的应对策略是一Scheduler可以包含多少Job但具体的实现可能需要读者自行参考两个项目。在后续的文章中我会介绍如何进行部署。
对于管理界面,则是采用的RemoteScheduler进行控制。因为QuartzService采用的是进程的方式运行任务,所以在管理上还加了对任务进程的管理。
对于任务的解耦
在QuartzService中并没有对于任务的调用,采用了反射的方式。这个主要出于两个方面的考虑:1.对于管理中可能出现的多版本的.NET Framework(我现在的项目中就有这个问题);2.将任务做成可配置,这样方便部署。但是以上两种考虑就造成了不能对Scheduler进行监听,对于这个这个问题读者可以自己再重写一个Scheduler管理程序。这个后续会做介绍。
Quartz.NET: http://www.quartz-scheduler.net/
QuartzService: https://github.com/BarlowDu/QuartzService