如何检测 Quartz.net 中作业何时被取消?
How to detect when a job was canceled in 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
属性 设置为一个自定义值,告诉我作业已被取消,但肯定有一个“正确”的方法来做到这一点?
我发现了问题:显然我应该是在作业的 Execute
方法中手动抛出 JobExecutionException
的人,当该方法抛出任何其他异常时,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...
}
}
我正在使用 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
属性 设置为一个自定义值,告诉我作业已被取消,但肯定有一个“正确”的方法来做到这一点?
我发现了问题:显然我应该是在作业的 Execute
方法中手动抛出 JobExecutionException
的人,当该方法抛出任何其他异常时,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...
}
}