c# - 如何强制 quartz.net 作业在完成后重新启动

标签 c# .net quartz.net topshelf

我有一个项目,我使用 TopShelfTopShelf.Quartz

正在关注 this example我正在建立我的工作

                s.ScheduleQuartzJob(q =>
                    q.WithJob(() => JobBuilder.Create<MyJob>().Build())
                    .AddTrigger(() => TriggerBuilder.Create()
                        .WithSimpleSchedule(builder => builder
                            .WithIntervalInSeconds(5)
                            .RepeatForever())
                        .Build())
                );

即使前一个仍在运行,它也会每五秒触发一次我的工作。我真正想要实现的是开始一份工作,完成后等待五秒钟,然后重新开始。这是可能的还是我必须实现自己的逻辑(例如通过静态变量)。

最佳答案

@NateKerkhofs 提议的作业监听器将起作用,如下所示:

public class RepeatAfterCompletionJobListener : IJobListener
{
    private readonly TimeSpan interval;

    public RepeatAfterCompletionJobListener(TimeSpan interval)
    {
        this.interval = interval;
    }

    public void JobExecutionVetoed(IJobExecutionContext context)
    {
    }

    public void JobToBeExecuted(IJobExecutionContext context)
    {
    }

    public void JobWasExecuted(IJobExecutionContext context, JobExecutionException jobException)
    {
       string triggerKey = context.JobDetail.Key.Name + ".trigger";

        var trigger = TriggerBuilder.Create()
                .WithIdentity(triggerKey)
                .StartAt(new DateTimeOffset(DateTime.UtcNow.Add(interval)))
                .Build();

        context.Scheduler.RescheduleJob(new TriggerKey(triggerKey), trigger);
    }

    public string Name
    {
        get
        {
            return "RepeatAfterCompletionJobListener";
        }
    }
}

然后将监听器添加到调度器:

var jobKey = "myJobKey";
var schedule = new StdSchedulerFactory().GetScheduler();
listener = new
   RepeatAfterCompletionJobListener(TimeSpan.FromSeconds(5));

schedule.ListenerManager.AddJobListener
         (listener, KeyMatcher<JobKey>.KeyEquals(new JobKey(jobKey)));

var job = JobBuilder.Create(MyJob)
                .WithIdentity(jobKey)
                .Build();

// Schedule the job to start in 5 seconds to give the service time to initialise
var trigger = TriggerBuilder.Create()
                .WithIdentity(CreateTriggerKey(jobKey))
                .StartAt(DateTimeOffset.Now.AddSeconds(5))
                .Build();

schedule.ScheduleJob(job, trigger);

不幸的是,我不知道如何使用 Typshelf.Quartz 库使用的流畅语法来做到这一点(或者是否可以做到),我将其与 TopShelf 和常规 Quartz.Net 一起使用。

关于c# - 如何强制 quartz.net 作业在完成后重新启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25930384/

相关文章:

c# - Linq 获取所有控件(有序)

quartz.net - 如果过去安排了工作会怎样?

c# - 从 Web 服务处理数据库 - 如何提高性能?

c# - 如何退出方法并将控制权返回给用户而不是调用方法?

c# - 什么可能导致(托管)UIAutomation 在枚举子级时获得 self 引用

.net - 指定索引文档集合排序

c# - 将 oracle db 配置为 Quartz.net 调度程序时出错

c# - Quartz.net 和 Common.Logging - 使用 Log4Net

c# - 使用 ValidationProperty 属性防止 UserControl 的完整回发

c# - CSV 第一个单元格限制