Scheduler
quartz想要运行,需要先配置好TreadPool,JobStore,DataSource,Scheduler
- TreadPool的默认实现DefaultThreadPool可以配置最大并发数等属性,也说明quartz的定时任务都是在后台执行的。
- JobStore和DataSource上一节说过了,一般使用默认值不用配置。
- Scheduler需要最后配置,生成实例并关联JobStore和ThreadPool。
StdSchedulerFactory
绝大多数情况下使用的Scheduler工厂。
ISchedulerFactory的一个实现类,调用GetScheduler方法就可以初始化一个Scheduler(包括关联的ThreadPool、JobStore和DataSources)。
DirectSchedulerFactory
除非特别了解Scheduler工厂,否则一般不使用这个类。
使用这个工厂需要手动配置工厂的所有属性。
Logging
quartz默认使用LibLog来做日志记录,LibLog只会记录初始化信息和job在excute时候报错的信息,也可以自行选择使用Log4Net来代替默认的日志
集群Cluster
集群配置只能在JobStore使用JobStoreTx的情况下使用。
进行如下配置:
quartz.jobStore.clustered=true
集群里面的实例都需要使用相同的quartz配置,除了以下两个属性:
- ThreadPool的pool size
- quartz.scheduler.instanceId(设置成Auto之后会自动区别)一定要唯一
注意1:如果定时任务集群要使用多台服务器,那么这些服务器上的时间要是一致的!
注意2:非集群的两个定时任务,不要用JobStoreTx关联同一个数据库!
注意3:如果cpu性能不够,已经100%使用的CPU无法及时更新数据库里面的jobStore数据,会引发job多次execute
其他
Quartz.Jobs命名空间提供了一些特殊的Job,实现发送邮件等功能。
但是这是一个单独的NuGet包,如果需要请安装Quartz.Jobs
Install-Package Quartz.Jobs -Version 3.2.3
JobFactory
默认的JobFactory,在trigger触发的时候,会创建Job的实例。
实现IJobFactory接口,可以自定义JobFactory,来实现自己需要的功能,例如:由应用中的IoC或者DI容器来创建Job实例的功能。
quartz主要配置信息可以查看:https://www.quartz-scheduler.net/documentation/quartz-3.x/configuration/reference.html
quartz和timer的区别
framework自带的system.timers.timer类也可以用来做任务,但是选择quartz的理由如下:
- timer做定时任务无法设置复杂的时间机制,而quartz可以使用cron表达式
- timer没有利用ThreadPool(只是开启了thread),而quartz利用了
- timer没有quartz这样的存储机制(RAM or ADO)
- 特别简单的定时任务用timer当然也没问题!~
web环境下IIS搞事情
IIS的回收机制会导致quartz经常不触发,IIS8可以设置网站Preloaded+kept running
参考:https://docs.microsoft.com/zh-cn/archive/blogs/vijaysk/iis-8-whats-new-website-settings
建议定时任务可以写成service或者winform程序部署在服务器上-,-