如何在 C# .NET 中在运行时编辑 cron 表达式?

问题描述 投票:0回答:1

我有一个 Quartz.NET 的应用程序,它从客户端接收一个 cron 表达式作为字符串(例如

0 0 12 * * ?
- 每天中午 12 点触发),但我实际上需要 Quartz 作业提前半小时触发。

问题是我不知道 cron 表达式会提前是什么(所以我不能只将 cron 触发器设置为

0 30 11 * * ?
- 每天上午 11:30 触发)。

是否有一种通用方法可以编辑任意 cron 表达式,使其提前半小时触发?

我还考虑过编辑 Quartz.NET cron 触发器(从原始 cron 表达式创建),但找不到如何做到这一点。

c# .net cron quartz.net
1个回答
1
投票

这里有一个想法 - 在 CronTriggerImpl 上实现一个装饰器,并使用按您需要的方式改变计时的代码覆盖 ComputeFirstFireTimeUtcGetFireTimeAfter -

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(...))
© www.soinside.com 2019 - 2024. All rights reserved.