我有一个 Quartz.NET 的应用程序,它从客户端接收一个 cron 表达式作为字符串(例如
0 0 12 * * ?
- 每天中午 12 点触发),但我实际上需要 Quartz 作业提前半小时触发。
问题是我不知道 cron 表达式会提前是什么(所以我不能只将 cron 触发器设置为
0 30 11 * * ?
- 每天上午 11:30 触发)。
是否有一种通用方法可以编辑任意 cron 表达式,使其提前半小时触发?
我还考虑过编辑 Quartz.NET cron 触发器(从原始 cron 表达式创建),但找不到如何做到这一点。
这里有一个想法 - 在 CronTriggerImpl 上实现一个装饰器,并使用按您需要的方式改变计时的代码覆盖 ComputeFirstFireTimeUtc 和 GetFireTimeAfter -
public class CronTriggerImplDecorator : AbstractTrigger, ICronTrigger
{
private readonly CronTriggerImpl inner;
...
public override DateTimeOffset? ComputeFirstFireTimeUtc(ICalendar? cal)
...
public override DateTimeOffset? GetFireTimeAfter(DateTimeOffset? afterTime)
然后定义返回装饰器的日程构建器 -
public class CustomScheduleBuilder : IScheduleBuilder
{
private readonly CronExpression cronExpression;
public CustomScheduleBuilder(CronExpression cronExpression)
{
this.cronExpression = cronExpression;
}
private int misfireInstruction = MisfireInstruction.SmartPolicy;
public IMutableTrigger Build()
{
CronTriggerImpl ct = new CronTriggerImpl();
ct.CronExpression = cronExpression;
ct.TimeZone = cronExpression.TimeZone;
ct.MisfireInstruction = misfireInstruction;
return new CronTriggerImplDecorator(ct);
}
}
最终在构建触发器时使用构建器 -
.WithSchedule(new CustomScheduleBuilder(...))