钩到Quartz.net中的shutdown方法

本文关键字:shutdown 方法 中的 net Quartz 钩到 | 更新日期: 2023-09-27 18:02:29

我有一个长时间运行的作业,迭代超过百万行来完成一些任务。我希望能够在这个迭代的中间停止,如果关机被请求的工作。这里是

public class MyLongRunningJob : IJob
{   
    public void Execute(IJobExecutionContext context)
    {
        var rows = GetAllRows();
        foreach(var row in rows)
        {
            DoSomething(row);
        }
    }
}

我想要这样的

public class MyLongRunningJob : IJob
{
    bool _stop = false;
    public void Execute(IJobExecutionContext context)
    {
        var rows = GetAllRows();
        foreach(var row in rows)
        {
            if(_stop) break;
            DoSomething(row);
        }
    }
}

由于执行方法可能需要超过1小时,我想在某个时候将_stop设置为true,当我调用我的调度程序Shutdown时,我找不到IJob或调度程序上的任何东西。

这个长时间运行的作业是我的windows服务上唯一执行的任务,并且希望尽快从Execute方法中退出。

windows服务是Autofac的TopShelf服务,看起来像

public class Service : IService
{
    private readonly IScheduler _scheduler;
    public Service(IScheduler scheduler)
    {
        _scheduler = scheduler;
    }
    public void Start()
    {
        _scheduler.Start();
    }
    public void Stop()
    {
        _scheduler.Shutdown();
    }
}

钩到Quartz.net中的shutdown方法

所以我读了Quartz。我以前从未使用过它,但这个线程是有趣的Async/Await支持

在阅读之后,我注意到当前的想法是使用继承IJobIInterruptableJob

这允许调度调用中断方法,允许你"很好"地停止代码。从该接口的文档:

实际中断作业的方法必须在本身(这种方法)接口只是调度器通知请求被中断)。这种机制在不同的实现中,用于中断自身的作业可能有所不同。然而,在任何实现中的原则思想应该是具有作业的主体会定期检查一些标志来查看是否请求了中断,以及是否以某种方式设置了标志中止执行该任务的其余工作。的例子可以在Example7的DumbInterruptableJob类的源代码中找到中断作业的方法使用它是合法的和的组合和内部的同步为了使方法阻塞直到表示它已注意到set标志。