这是一个基于Quartz.Net的重试类库,该类库对应需长时间间隔重试的业务类型,比如通知服务,当然其本质还是Job。
NuGet version (LongIntervalRetries) GitHub license
目前支持以下版本:.NET452、.NET Standard 2.0
StdRetry<T>为类库入口,其构造函数具备以下参数
IScheduler scheduler = null,即Quartz.IScheduler,如不传入,则采用默认Quartz.Impl.StdSchedulerFactory.GetDefaultScheduler(),注意配置文件quartz.config在默认实现时依然有效IStore<T> store = null,定义重试信息如何存储与恢复,如不传入,则默认采用LongIntervalRetries.Stores.NoneStore,即不采取任何存储IRetryRuleManager ruleManager = null,定义重试策略IRetryRule的管理类,如不传入,则默认采用LongIntervalRetries.Rules.StdRetryRuleManager,注意无特殊情况无需自己实现接口定义IRetryJobListener retryJobListener = null,定义Job的重试监控策略,如不传入,则默认采用LongIntervalRetries.StdRetryJobListener,该实现默认按Exception来判断是否需要重试,注意无特殊情况无需自己实现接口定义
具体说明请参考Quartz.Net
目前Sql存储实现为LongIntervalRetries.Stores.AdoStores
MySQLStore基于MySQL存储实现,其初始化Sql目录为/doc/DB/(version)/mysql.sqlSqlServerStore基于MSSQL存储实现,其初始化Sql目录为/doc/DB/(version)/sqlserver.sql
IRetryRule默认提供以下两种实现,目前两种实现在第一次执行时均直接返回 TimeSpan.Zero,即在第一次执行时均立刻执行
SimpleRepeatRetryRule简单重试规则,该规则简单的定义了总执行次数以及简单的重试间隔(第一次正常执行 + 允许的重试次数 = 总执行次数)CustomIntervalRetryRule自定义间隔重试规则,该规则接收一系列的时间参数params TimeSpan[] intervals,该数组的Length属性即为允许重试的最大次数,该规则会直接将 当前执行次数-1 作为索引获取对应TimeSpan(第一次正常执行 + intervals.Length = 总执行次数)
在Job执行过程中,你可能发现数据存在问题,或指定业务内容已经处理完成,那么这时候你可以人为的返回成功,但这样在执行结果过滤上无法过滤出真实执行完成和假的执行完成,如果你直接抛出Exception,使得类库反复执行指定次数的Job再结束也是可以,但存在性能上的浪费,这时候你可通过抛出RetryJobAbortedException,这是一个自定义异常,专门用于终止当前Job。
var retry = new StdRetry(); //声明并注册重试规则 string simpleRuleName = "SimpleRepeatRetryRule"; var simpleRepeatRule = new SimpleRepeatRetryRule(simpleRuleName, 5, TimeSpan.FromSeconds(2)); retry.RuleManager.AddRule(simpleRepeatRule); var registerInfo = new RetryJobRegisterInfo { //指定要采用的重试规则,如果不设置,则默认使用已注册的第一项 UsedRuleName = simpleRuleName, //需要传递给IJob的上下文数据 JobMap = new Dictionary<string, object> { {"SomeKey","SomeValue" } }, //开始执行时间,如果不指定则表示立刻执行 StartAt = DateTimeOffset.UtcNow.AddSeconds(3), }; //注册要执行的Job retry.RegisterJob<SomeJob>(registerInfo); //注册每次Job执行后的通知事件 retry.RegisterEvent<SomeJob>(e => {//Some code }); retry.Start();//启动Quartz服务 //启动服务后仍可以RegisterJob、RegisterEvent
该例子包含以下Job
SimpleJob所有例子Job的基类AlawaysSuccessJob永远执行成功的Job例子AlawaysFailJob永远执行失败的Job例子,该例子可用于测试重试机制MaybeFailJob可能会执行失败的Job例子,该例子最符合实际情况,根据随机数来决定是否会抛出异常
简单的使用例子,包含了如何注册IRetryRule,如何注册IJob,如何注册执行结果事件,如何通过RetryJobRegisterInfo.JobMap来传递参数到实际执行的IJob
用于展示如何支持将注册请求持久化至关系型数据库MySql及MSSQL
2018年12月16日
- Release v1.1.1 修复因为
EndAt导致quartz重启还未Start时杀死的Job未能触发RegisterEvent的问题
2018年12月14日
- Release v1.1.0 增加用于在指定时间结束Job的
EndAt,以及增加用于记录最后一次执行异常的LastException
2018年06月12日
- Release v1.0.0