В настоящее время я работаю менеджером по работе на основе Quartz.net
. Я хочу иметь возможность отображать статус выполнения задания в реальном времени, поэтому, когда запрос на прерывание работы сделан, я мог бы сохранить context.JobDetail.JobDataMap.Put("status", "interrupting");
в карте данных задания и прочитать этот статус, извлекая все выполняемые в настоящее время задания в планировщике. Но проблема заключается в том, что у меня нет доступа к объекту контекста IJobExecutionContext
непосредственно в методе Interrupt()
, поэтому я не могу установить прерывание состояния сразу в момент запроса прерывания. Это функциональность основном я хочу добиться:Как получить доступ к IJobexecutionContext в методе прерывания в Quartz.net?
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()
метод?