【问题标题】:Hook to shutdown method in Quartz.netQuartz.net 中的挂钩关闭方法
【发布时间】:2016-08-16 18:20:26
【问题描述】:

我有一个长期运行的工作,它迭代超过数百万行来完成一些任务。 如果作业请求关闭,我希望能够在此迭代的中间停止。基本上我有这个

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);
        }
    }
}

由于 Execute 方法可能需要超过 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();
    }
}

【问题讨论】:

  • 您可以使用取消令牌或自动重置事件
  • 感谢@CallumLinington 的建议,我可以将其中的任何一个包装在一个类中,使用autofac 的单个实例,这是一个好主意,但我想要使用Quartz 更直接的东西。如果没有其他解决方案,我会尝试您的想法。
  • 这可能就是我想要的。让您的评论成为答案,我会接受并投票。非常感谢@CallumLinington
  • 我添加了答案

标签: c# quartz.net


【解决方案1】:

所以我正在阅读 Quartz。我以前从未使用过,但这个帖子很有趣Async/Await Support

读下来后,我注意到当前的想法是使用继承IJobIInterruptableJob

这允许调度程序调用中断方法来让你“很好地”停止你的代码。来自该界面上的文档:

实际中断 Job 的方法必须在 本身(这个方法 接口只是调度程序通知 已提出中断请求)。该机制 您用来中断自己的工作可能因实现而异。 然而,任何实现的主要思想都应该是 作业的主体定期检查一些标志以 查看是否已请求中断,是否设置了标志,不知何故 中止工作的其余工作的执行。一个例子 可以在 Example7 的 DumbInterruptableJob 类的源代码中找到中断作业 使用是合法的 和的一些组合 内同步和 为了让方法阻塞,直到 表示它已经注意到设置的标志。

我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    • 2015-09-22
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-01
    相关资源
    最近更新 更多