Quartz.Net 官方教程 Tutorial 2/3(Listener 和 JobStore)
Listener
调度任务的监听,当前版本支持添加调度,触发器和任务的监听,其中触发器和任务的监听支持通过监听名称进行添加(Add*ListenerMatcher方法)
监听不能对外抛出异常,需要内部处理,类似于切面,监听的返回结果不会影响程序主体
Job Listener
- IJobListener 接口
public interface IJobListener
{
string Name { get; }
// 执行前
Task JobToBeExecuted(IJobExecutionContext context);
// 作业即将被执行,但是被触发器否决了
Task JobExecutionVetoed(IJobExecutionContext context);
// 执行完毕
Task JobWasExecuted(IJobExecutionContext context, JobExecutionException jobException);
}
-
Quartz.NET 自带一个监听的虚函数:JobListenerSupport
-
向ListenerManager中添加监听
//监听指定的任务 scheduler.ListenerManager.AddJobListener(myJobListener, KeyMatcher<JobKey>.KeyEquals(new JobKey("myJobName", "myJobGroup"))); // 监听指定的群组 scheduler.ListenerManager.AddJobListener(myJobListener, GroupMatcher<JobKey>.GroupEquals("myJobGroup")); // 监听多个群组 scheduler.ListenerManager.AddJobListener(myJobListener, OrMatcher<JobKey>.Or(GroupMatcher<JobKey>.GroupEquals("myJobGroup"), GroupMatcher<JobKey>.GroupEquals("yourGroup"))); // 所有任务都监听 scheduler.ListenerManager.AddJobListener(myJobListener, GroupMatcher<JobKey>.AnyGroup());
Tigger Listener
- ITriggerListener 接口
public interface ITriggerListener
{
string Name { get; }
// 触发器激活时触发
Task TriggerFired(ITrigger trigger, IJobExecutionContext context);
// 触发器失效后出发
Task<bool> VetoJobExecution(ITrigger trigger, IJobExecutionContext context);
// 执行失效后触发(执行未执行指令时出现问题-超时或者异常)
Task TriggerMisfired(ITrigger trigger);
// 触发器失效后触发
Task TriggerComplete(ITrigger trigger, IJobExecutionContext context, int triggerInstructionCode);
}
- Quartz.NET 自带一个监听的虚函数:TriggerListenerSupport
- 向ListenerManager中添加监听方式与Job一致,只是第一个参数改为了ITriggerListener的实现类
Scheduler Listener
-
ISchedulerListener接口
public interface ISchedulerListener { // 当IJobDetail添加到IScheduler时触发 Task JobScheduled(Trigger trigger); // 当卸载IJobDetail时触发(如果任务设置为非持久化,则触发器结束任务会被卸载) Task JobUnscheduled(string triggerName, string triggerGroup); // 触发器完成时触发 Task TriggerFinalized(Trigger trigger); // 触发器暂停时触发 Task TriggersPaused(string triggerName, string triggerGroup); // 重新开始时触发 Task TriggersResumed(string triggerName, string triggerGroup); // 任务暂停时触发 Task JobsPaused(string jobName, string jobGroup); // 任务重新开始触发 Task JobsResumed(string jobName, string jobGroup); // 调度器出现问题时触发 Task SchedulerError(string msg, SchedulerException cause); // 调度器关闭时触发 Task SchedulerShutdown(); }
-
向ListenerManager中添加/移除监听
// 添加 scheduler.ListenerManager.AddSchedulerListener(mySchedListener); // 移除 scheduler.ListenerManager.RemoveSchedulerListener(mySchedListener);
JobStore
该类存储了调度器中的工作数据(所有的任务,触发器和日历),可以通过对JobStore进行配置来实现对调度器中数据的管理(例如存储到数据库中等)
警告:不要再代码中使用JobStore实例,JobStore由Quartz.NET自主执行,可以通过配置进行设置。
-
JobStore设置
1.配置文件(quartz.properties)中配置
// 默认使用RAMJobStore配置 quartz.jobStore.type = Quartz.Simpl.RAMJobStore, Quartz
2.代码中进行配置
// 创建JobStore JobStore jobStore = new RAMJobStore(); // 创建线程池(Quartz.NET自带的CLR的托管线程池) var threadPool = new DefaultThreadPool(); // 最大并发数,默认是10 // threadPool.MaxConcurrency = 10; // 初始化 threadPool.Initialize(); // 创建Schedule IScheduler sched = DirectSchedulerFactory.Instance.CreateScheduler(new DefaultThreadPool(), jobStore);
-
JobStore各配置说明
-
RAMJobStore
Quartz.NET默认选项,将所有数据都保存到RAM中,因此效率最高;缺点是数据不是持久保存的,奔溃/结束后数据会被释放。
使用RAMJobStore时可直接使用StdSchedulerFactory创建调度器,无需做其他操作
-
AdoJobStore
通过ADO.NET将数据存储在数据库中,性能下降程度需要看是否创建了主键索引。
Sql脚本在database/tables下面,表名前缀为QRTZ_
可以使用JobStoreTX来管理事务,数据源需要额外配置
// 将类型设置为JobStoreTX quartz.jobStore.type = Quartz.Impl.AdoJobStore.JobStoreTX, Quartz //DriverDelegate驱动代理,设置需要那种数据库 // StdAdoDelegate为ADO.NET的相关配置库 quartz.jobStore.driverDelegateType = Quartz.Impl.AdoJobStore.StdAdoDelegate, Quartz // 表前缀设置 quartz.jobStore.tablePrefix = QRTZ_ // 数据源名称 quartz.jobStore.dataSource = myDS // 数据源连接字符串 quartz.dataSource.myDS.connectionString = Server=localhost;Database=quartz;Uid=quartznet;Pwd=quartznet // 数据库信息 quartz.dataSource.myDS.provider = MySql // 将JobDataMaps的相关数据也进行保存 quartz.jobStore.useProperties = true // 序列化的格式为json quartz.serializer.type = json
Quarz.NET支持的数据库列表如下(与资源配置中的支持列表不同,建议已资源配置的为准):
SqlServer
- SQL server的数据库链接- 除了3.1版本外,默认依赖包为System.Data.SqlClient
- .NET Core(3.2版本)默认依赖包为 Microsoft.Data.SqlClient
SystemDataSqlClient
- framework 的默认设置MicrosoftDataSqlClient
- .NET Core默认设置OracleODP
- Oracle 数据库链接OracleODPManaged
- Oracle 11及以上MySql
- MySQLSQLite
- SQLiteSQLite-Microsoft
- Microsoft SQLiteFirebird
- FirebirdNpgsql
- PostgreSQL
-