石英.. NET运行作业自重新调度



我已经创建了一个石英。. NET作业完全程序化(没有配置文件等)。它运行得很准时。作业初始化为每5分钟运行一次的cron字符串。我想让工作根据环境改变自己的时间表(例如错误会随着时间的推移而发生,所以cron应该更改为30分钟)。

我想确定在

里写些什么。
protected override void ExecuteInternal( IJobExecutionContext context )

方法,以便作业"自行更改"。我在上下文中设置了什么吗。调度器财产吗?我是否必须去调度器本身并终止作业并重新创建它(听起来有点沉重的我虽然)?

虽然我没有使用石英。我在Java项目中使用过Quartz,我认为它们是相似的。我已经实现了一个类似于你所描述的解决方案。在executeinternal方法中,您可以访问作业执行上下文。基本上,它涉及到创建一个新的触发器,然后重新调度作业(rescheduleJob)。所以当出现这种情况时,你可以这样做:

protected void ExecuteInternal( IJobExecutionContext context ) {
  // ... some code
  if (the_condition) {
     // figure out startTime
     // figure out endTime
     // figure out repeat time
     // figoure out repeatInterval
     Trigger trigger = new SimpleTrigger("OurNewTrigger","GROUP_NAME", context.getJobDetail().getName(),context.getJobDetail().getGroup(), startTime, endTime,repeatTime,repeatInterval);
     context.getScheduler().rescheduleJob("OurNewTrigger","GROUP_NAME",trigger);
  }
  // ... some more code
}

沿着这些行。

我想在随机时间范围内运行作业,在上次运行时间后5到25分钟之间,通过使用这个答案(来自@skarist)并对其进行一些更改并使用quartz文档,我解决了我的问题:

public class YourJob : IJob
{
  public void Execute(IJobExecutionContext context)
  {
    //write your execution code

    //reschedule code after execution code:
     var random = new Random();
     var num = random.Next(5,25);
     var date = DateTime.Now;
     var hour = date.AddMinutes(num).Hour;
     var min = date.AddMinutes(num).Minute;
     ITrigger trigger = TriggerBuilder.Create()
        .WithIdentity(context.Trigger.Key.Name)
        .WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(hour, min))
        .StartAt(DateTime.Now)
        .WithPriority(1)
        .Build();
    IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
    scheduler.RescheduleJob(new TriggerKey(context.Trigger.Key.Name), trigger);
    }
}

skarist让我走上了正确的道路。包括我在这里的发现,为下一个遇到这种情况的孩子。

protected override void ExecuteInternal( IJobExecutionContext jobContext )
{
    // ... do work...
    var tnew = new CronTriggerImpl( #nameofcurrentlyrunningjob# )
    {
        CronExpressionString = "my new cron string is here" ,
        TimeZone = TimeZoneInfo.Utc
    };
    var jobNew = new JobDetailImpl( #nameofcurrentlyrunningjob# , typeof( CurrentJobType ) );
    jobContext.Scheduler.RescheduleJob( new TriggerKey( #nameofcurrentlyrunningjob# ) , tnew );
}

我还添加了[DisallowConcurrentExecution]属性到类,但这不是直接相关的

最新更新