【问题标题】:How to rerun my job after it's end?工作结束后如何重新运行我的工作?
【发布时间】:2015-08-08 23:32:24
【问题描述】:

我正在使用 Quartz.Net 库。我写了一些触发器:

var t = 
   TriggerBuilder.Create()
   .WithIdentity("FirstTask", "TaskGroup")
   .StartAt(DateBuilder.TodayAt(16, 17, 0))
   .EndAt(DateBuilder.TodayAt(17, 17, 0))
   .WithSimpleSchedule(x => x.RepeatForever()
                             .WithIntervalInSeconds(1))
   .Build();

如果我排除 .WithIntervalInSeconds(1) 我有一个例外,即重试时间不能为零。那么,我如何在工作完成后重新开始工作?我也没有找到quartz.net 配置文件来设置它的最大线程数。

【问题讨论】:

    标签: c# quartz-scheduler quartz.net


    【解决方案1】:

    将最大线程数设置为 50:

    var properties = new NameValueCollection { { @"quartz.threadPool.threadCount", @"50" } };
    var factory = new StdSchedulerFactory(properties);
    var scheduler = schedulerFactory.GetScheduler();
    

    并且不要排除WithIntervalInSeconds,Quartz必须知道,什么时候再运行

    【讨论】:

    • defolt 在石英中有多少个胎面?是的,但我需要在完成后再次运行该作业。不是计时器,
    • @user3818229 10(十)-stackoverflow.com/questions/4108403/…
    • 谢谢!但是重新运行我的任务呢?
    • @user3818229 正如我所说,保持您的代码不变。看起来不错
    • 在此间隔下,我的任务会在 1 秒后重新运行。但这不是我想做的。
    【解决方案2】:

    在我之前的工作中,我们将Quartz threadpool 配置如下:

    quartz.threadPool.threadCount = 3
    

    Configuration 部分了解更多信息。

    @stuartd 回答您的问题here
    接受他的回答,然后将触发器更改为使用StartNow 方法:

    var trigger = TriggerBuilder.Create()
                                .WithIdentity(triggerKey)
                                .startNow()
                                .build();
    

    @SchlaWiener 还使用TopShelf 提供了一个不错的解决方案。

    【讨论】:

    • 我真正想要实现的是在 startTime 和 endTime 之间开始工作,并在每次完成后重新开始。如果 endTime 过期,也停止这些系列。
    • @user3818229 所以自定义RepeatAfterCompletionJobListener 来实现它。注入日期(开始、停止和停止过期),然后添加逻辑...
    【解决方案3】:

    比最初看起来要容易得多:

    var job = JobBuilder.Create<HelloJob>().WithIdentity(new JobKey("Task_1", "TaskGroup")).Build();
    var t = TriggerBuilder.Create()
            .WithIdentity("Trigger_1", "TaskGroup")
            .StartAt(DateBuilder.TodayAt(21, 15, 0))
            .EndAt(DateBuilder.TodayAt(21, 18, 0))
            .Build();
    _scheduleService.Scheduler.ScheduleJob(job, t);
    

    以及listiner中的实现方法:

    public void JobWasExecuted(IJobExecutionContext context, JobExecutionException jobException)
    {
        if (DateTime.UtcNow > context.Trigger.EndTimeUtc)
            return;
        context.Scheduler.RescheduleJob(context.Trigger.Key, context.Trigger);
    }
    

    【讨论】:

      猜你喜欢
      • 2019-11-18
      • 2015-02-25
      • 1970-01-01
      • 2021-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多