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
Quartz.Net 官方教程 Tutorial 2/3(Listener 和 JobStore)的更多相关文章
- Quartz.net官方开发指南系列篇
Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中.它提供了巨大的灵活性而不牺牲 ...
- Unity性能优化(3)-官方教程Optimizing garbage collection in Unity games翻译
本文是Unity官方教程,性能优化系列的第三篇<Optimizing garbage collection in Unity games>的翻译. 相关文章: Unity性能优化(1)-官 ...
- Unity性能优化(4)-官方教程Optimizing graphics rendering in Unity games翻译
本文是Unity官方教程,性能优化系列的第四篇<Optimizing graphics rendering in Unity games>的翻译. 相关文章: Unity性能优化(1)-官 ...
- Unity性能优化(2)-官方教程Diagnosing performance problems using the Profiler window翻译
本文是Unity官方教程,性能优化系列的第二篇<Diagnosing performance problems using the Profiler window>的简单翻译. 相关文章: ...
- Quartz2.2.x官方教程
零.Quartz是什么?能干什么? Quartz是一个开源的任务调度框架.基于定时.定期的策略来执行任务是它的核心功能,比如x年x月的每个星期五上午8点到9点,每隔10分钟执行1次.Quartz有3个 ...
- [爬虫] 学Scrapy,顺便把它的官方教程给爬下来
想学爬虫主要是因为算法和数据是密切相关的,有数据之后可以玩更多有意思的事情,数据量大可以挖掘挖掘到更多的信息. 之前只会通过python中的request库来下载网页内容,再用BeautifulSou ...
- Note | PyTorch官方教程学习笔记
目录 1. 快速入门PYTORCH 1.1. 什么是PyTorch 1.1.1. 基础概念 1.1.2. 与NumPy之间的桥梁 1.2. Autograd: Automatic Differenti ...
- Unity性能优化(1)-官方教程The Profiler window翻译
本文是Unity官方教程,性能优化系列的第一篇<The Profiler window>的简单翻译. 相关文章: Unity性能优化(1)-官方教程The Profiler window翻 ...
- jeecg表单页面控件权限设置(请先看官方教程,如果能看懂就不用看这里了)
只是把看了官方教程后,觉得不清楚地方补充说明一下: 1. 2. 3. 4.用"jeecgDemoController.do?addorupdate"这个路径测试,不出意外现在应该可 ...
- [转]Google Guava官方教程(中文版)
Google Guava官方教程(中文版) http://ifeve.com/google-guava/
随机推荐
- PageRank原理分析
pagerank是将众多网页看成一个有向图,每个页面就是有向图中的节点.计算每个节点的出度和入度.如果一个网站被大量其他的网页引用,那么他就会有更高的pr分数. 原理 对于所有与节点i相连的节点,用他 ...
- Python基础之模块:6、hashlib模块 subprocess模块 logging模块
目录 一.hashlib模块 1.简介 2.基本操作与用法 二.subprocess模块 1.简介 2.基本操作与用法 三.logging模块 1.简介 2.基本操作与用法 一.hashlib模块 1 ...
- JVM堆内存转储
在发生内存溢出错误 java.lang.OutOfMemoryError 时, JVM自动执行堆内存转储,以方便事后进行排查和分析. JVM提供了一个命令行启动参数 HeapDumpOnOutOfMe ...
- 记一次多个Java Agent同时使用的类增强冲突问题及分析
摘要:Java Agent技术常被用于加载class文件之前进行拦截并修改字节码,以实现对Java应用的无侵入式增强. 本文分享自华为云社区<记一次多个JavaAgent同时使用的类增强冲突问题 ...
- 带你了解NLP的词嵌入
摘要:今天带领大家学习自然语言处理中的词嵌入的内容. 本文分享自华为云社区<[MindSpore易点通]深度学习系列-词嵌入>,作者:Skytier. 1 特征表示 在自然语言处理中,有一 ...
- SpringBoot 08: SpringBoot综合使用 MyBatis, Dubbo, Redis
业务背景 Student表 CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) COL ...
- Go语言核心36讲20
在上两篇文章中,我主要为你讲解了与go语句.goroutine和Go语言调度器有关的知识和技法. 内容很多,你不用急于完全消化,可以在编程实践过程中逐步理解和感悟,争取夯实它们. 现在,让我们暂时走下 ...
- Docker原理(图解+秒懂+史上最全)
背景:下一个视频版本,从架构师视角,尼恩为大家打造高可用.高并发中间件的原理与实操. 目标:通过视频和博客的方式,为各位潜力架构师,彻底介绍清楚架构师必须掌握的高可用.高并发环境,包括但不限于: 高可 ...
- 【数据结构与算法】希尔排序 python和c++实现
算法思路 每一次:固定间隔把数据分组,每一组进行排序 每次比上次选取更小的间隔分组,再每组排序,直到间隔为1 代码 c++:(越看越不明白了,后看) int gap = length;//length ...
- war包形式安装jenkins
(1)下载war包 输入命令:java -jar jenkins.war --httpPort=8080,更改端口 重新登录之后,输入密码创建用户等完成设置 (2)结合Tomcat安装: 将jenki ...