如何在 Quartz.net 中的中断方法中访问 IJobexecutionContext?
How to get access to IJobexecutionContext in Interrupt method in Quartz.net?
我目前正在开发基于 Quartz.net
的作业管理器。我希望能够实时显示作业执行状态,以便在发出作业中断请求时,我可以将 context.JobDetail.JobDataMap.Put("status", "interrupting");
保存在作业数据映射中,并通过在调度程序中获取所有当前正在执行的作业来读取此状态。但是,问题是我无法直接在 Interrupt()
方法中访问 IJobExecutionContext
上下文对象,因此我无法在请求中断时立即设置中断状态。这是我基本上想要实现的功能:
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
接口实现的基本思想,据我了解,就是在void Interrupt()
方法里面设置一些_interrupted
标志值到true
,然后检查这个标志Execute()
方法中每个执行步骤的值。所以,基本上,我们不能立即中断作业,我们可以提出中断请求,只有在执行中断状态检查时,我们才能通过抛出异常来中断作业,例如。 但我想在这么短的时间内为我的工作设置中断状态。我怎样才能做到这一点?甚至有可能在 Interrupt()
方法中获得 IJobExecutionContext context
对象吗?
好吧,事实证明解决方案非常明显且简单。我只需要创建私有
IJobExecutionContext _context = null;
我工作的字段 class 并在 Execute()
方法中将其值设置为 context
。
public void Execute(IJobExecutionContext context)
{
_context = context;
...
}
基本上我们只能中断正在执行的作业,所以如果 Interrupt()
被调用而不是 Execute()
至少被调用一次所以这种方法基本上适合我的需要并更新作业的 DataMap
在 Interrupt
被调用后立即。
我目前正在开发基于 Quartz.net
的作业管理器。我希望能够实时显示作业执行状态,以便在发出作业中断请求时,我可以将 context.JobDetail.JobDataMap.Put("status", "interrupting");
保存在作业数据映射中,并通过在调度程序中获取所有当前正在执行的作业来读取此状态。但是,问题是我无法直接在 Interrupt()
方法中访问 IJobExecutionContext
上下文对象,因此我无法在请求中断时立即设置中断状态。这是我基本上想要实现的功能:
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
接口实现的基本思想,据我了解,就是在void Interrupt()
方法里面设置一些_interrupted
标志值到true
,然后检查这个标志Execute()
方法中每个执行步骤的值。所以,基本上,我们不能立即中断作业,我们可以提出中断请求,只有在执行中断状态检查时,我们才能通过抛出异常来中断作业,例如。 但我想在这么短的时间内为我的工作设置中断状态。我怎样才能做到这一点?甚至有可能在 Interrupt()
方法中获得 IJobExecutionContext context
对象吗?
好吧,事实证明解决方案非常明显且简单。我只需要创建私有
IJobExecutionContext _context = null;
我工作的字段 class 并在 Execute()
方法中将其值设置为 context
。
public void Execute(IJobExecutionContext context)
{
_context = context;
...
}
基本上我们只能中断正在执行的作业,所以如果 Interrupt()
被调用而不是 Execute()
至少被调用一次所以这种方法基本上适合我的需要并更新作业的 DataMap
在 Interrupt
被调用后立即。