Quartz.NET是一个开源的作业调度框架,非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等。
Quartz.NET允许开发人员根据时间间隔(或天)来调度作业。它实现了作业和触发器的多对多关系,还能把多个作业与不同的触发器关联。
整合了 Quartz.NET的应用程序可以重用来自不同事件的作业,还可以为一个事件组合多个作业。
官方学习文档:http://www.quartz-scheduler.net/documentation/index.html
使用实例介绍:http://www.quartz-scheduler.net/documentation/quartz-2.x/quick-start.html
官方的源代码下载:http://sourceforge.net/projects/quartznet/files/quartznet/
下面将结合我的项目中的使用给大家分享一下
- 为什么要使用Quartz?
我们经常会有这样的应用场景:需要定时轮询某些符合条件的数据,在达到一定条件的时候,对数据做出一定的处理,比如:电商平台要搞促销活动,设定好活动开始时间,在到达开始时间的时候定时推一些促销信息到网站前台。这时我们常用的方法有:windows service,console job等等方式来处理,本文以Quartz调度console job来实现。
项目的总体思路是:用Windows Service把主程序Host起来,然后通过Quartz.net的可视化界面控制Job的执行和调度
首先创建Console Job程序,下载Quartz相关的包(Quartz.NET,CrystalQuartz.Remote),通过Nuget安装的话,相关依赖包会自动下载。
使用这个框架的最大的好处就是业务便于横向扩展,比如目前根据业务来说我有两个实现的功能,一个是抢购的商品到时间之后定时上下架,还有一个是超时订单15分钟未支付自动作废,我在项目中新建两个文件夹,放各自的业务处理类,其他的都是公用的。
接下来看具体的实现:
程序主入口用Service Run起来。
JobManager是添加的系统组建,里面的实现如下:
ServiceBase中的代码很关键,起到配置线程池的作用,这个地方设置线程池信息是整个框架在调度的时候通用的配置
新建一个作业调度的基类:JobService,实现如下:
主要用于设置Job的名称,作业组的名称,还有给调度器中添加每一个作业信息和各自的触发器信息
接下来基本的配置实现已经完成了,我们来看看具体的作业是怎么实现的?
各自的业务处理模块的模板都和这个类似,具体可根据自己的习惯来实现。关于触发器的配置还有另外一种做法,就是通过配置文件来实现,大家可以百度一下。
业务处理类中就根据各自不同的业务做具体的实现了,代码如下:
项目中纪录Log(这个很重要,非常重要)使用Nlog,数据库访问使用Dapper(轻量级的ORM,特别好用,性能也很好)
Job的工作已经基本完成了,接下来要做就是把添加安装文件,将Job做成Windows Service安装到服务器了,这个步骤就不再啰嗦了(如果不知道的童鞋可以百度,或者联系我要源码)
下面我们还剩最后一步,就是开始我们说的可视化控制,截至到目前我们做的都是不可见的服务,怎么用可视化的界面呈现给用户呢?继续往下
新建一个空的ASP.NET WebSite,安装CrystalQuartz.Remote 包,这个可以使得你在Web站点里面访问到框架生成的可视化界面。
安装完包之后我们可以看到在WebConfig中添加了相关的配置,最重要的就是SchedulerHost这个配置,这个地方指定的端口号就是我们在最开始创建线程池的时候制定的Port,儿地址就是我们当前服务器部署的地址了,需要说明的一点就是我们的Windows Service部署的服务器和WebSite部署的站点是要在同一个服务器上的。
接下来就是启动将新建的网站部署到IIS,开启WindowsService,然后在浏览器里面浏览新的站点,在默认的端口后面直接输入:/CrystalQuartzPanel.axd 就看访问了
看到这么清爽的界面,很是激动人心啊,我们不用自己开发可视化的Job调度框架就可以通过界面来控制我们的服务了,是不是很心动呢?
心动不如行动啊,筒子们如果有想法就动手实践一下,我差不多用了3个小时左右的时间来实践了一下。Quartz框架中的其他功能暂时还没研究。
如果在实现过程中有什么问题可以给我留言,我把源码共享出来,大家一起研究,学习~~