如何在Quartz.net中的Interrupt方法中访问IJobexecutionContext?

时间:2015-11-03 17:22:15

标签: c# quartz-scheduler quartz.net

我目前正在根据Quartz.net开发职位经理。我希望能够实时显示作业执行状态,因此在作业中断请求发出时,我可以将context.JobDetail.JobDataMap.Put("status", "interrupting");保存在作业数据映射中,并通过获取调度程序中当前正在执行的所有作业来读取此状态。但是,问题是,我无法直接在IJobExecutionContext方法中访问Interrupt()上下文对象,因此我无法在请求中断时立即设置中断状态。这是我基本上想要实现的功能:

class InterruptedException : Exception { }

[PersistJobDataAfterExecution, DisallowConcurrentExecution]
class MyJob : IInterruptableJob
{
    private bool _interrupted;
    private void AssertContinue()
    {
        if (_interrupted) throw new InterruptedException();
    }

    public void Execute(IJobExecutionContext context)
    {
        try
        {
            context.JobDetail.JobDataMap.Put("status", "started");
            AssertContinue();

            // Do the work
            AssertContinue();

            context.JobDetail.JobDataMap.Put("status", "completed");
        }
        catch (InterruptedException)
        {
            // Set interrupted status when job is actually interrupted
            context.JobDetail.JobDataMap.Put("status", "interrupted");
        }
        catch
        {
            // log any othe errors but set interrupted status only on InterruptedException
        }
    }

    public void Interrupt()
    {
        _interrupted = true;

        // I want to set interrupting statues here!!!
        context.JobDetail.JobDataMap.Put("status", "interrupting");
    }
}

据我所知,IInterruptableJob接口实现的基本思想是在_interrupted方法中将true标记值设置为void Interrupt(),然后检查此标记值Execute()方法中的每个执行步骤。因此,基本上,我们不能立即中断作业,我们可以发出中断请求,并且只有在执行中断状态检查时,我们才能通过抛出异常来中断作业,例如。 但我希望在这么短的时间内为我的工作设置中断状态。我怎样才能做到这一点?甚至可以在IJobExecutionContext context方法中获取Interrupt()对象吗?

1 个答案:

答案 0 :(得分:2)

嗯,解决方案结果非常明显且简单。我只需要创建私人

IJobExecutionContext _context = null;

我的工作类字段,并在context方法中将其值设置为Execute()

public void Execute(IJobExecutionContext context) 
{
    _context = context;
    ...
}

基本上我们只能中断正在执行的作业,所以如果调用Interrupt()而不是Execute()被调用至少一次,那么这种方法基本上适合我的需要并在紧接着更新作业DataMap之后Interrupt被召唤。