如何检测 Quartz.net 中的作业何时被取消?

问题描述

我正在使用 Quartz.net 3.x,并且按照我能找到的关于该主题的小文档,我已经实现了取消我的工作的功能,如下所示:

public class MyJob : IJob
  public async Task Execute(IJobExecutionContext context)
  {
      //Do some stuff...
      context.CancellationToken.ThrowIfCancellationRequested();
      //Do other stuff...
  }
}

这似乎工作正常,实际上如果取消作业,通过调用以下代码

scheduler.Interrupt(myJobKey);

作业在遇到下一个 ThrowIfCancellationRequested() 指令时停止。

但是,问题是我有一个 IJobListener,当作业完成时,需要检查作业是否被取消或是否正确完成。我试过像这样实现它:

public Task JobWasExecuted(IJobExecutionContext context,JobExecutionException jobException,CancellationToken cancellationToken = default(CancellationToken))
            {
    if(jobException != null && jobException.InnerException is OperationCanceledException){
        //doesn't work,when a OperationCanceledException was raised as a result of calling ThrowIfCancellationRequested() jobException is null 
    }

    if(cancellationToken.IsCancellationRequested){
        //doesn't work either,IsCancellationRequested is always false
    }
}

在这里错过了什么?我目前有一个解决方法,我将作业上下文的 Result 属性设置为一个自定义值,该值告诉我作业已取消,但肯定有一种“正确”的方法可以做到这一点?

解决方法

我发现了问题:显然我应该是在作业的 JobExecutionException 方法中手动抛出 Execute 的人,当该方法抛出任何其他异常时,Quartz 不会自动执行此操作。或者,至少,它并不总是自动执行它,因为当我重新抛出其他异常类型时它正在执行...也许它只自动处理某些类型的异常?

我不知道,但这有效:

public class MyJob : IJob
  public async Task Execute(IJobExecutionContext context)
  {
      //Do some stuff...
      try{
        context.CancellationToken.ThrowIfCancellationRequested();
      } 
      catch(OperationCanceledException ex){
        throw new JobExecutionException(ex);
      }
      //Do other stuff...
  }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...