问题描述
我正在使用 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...
}
}