2015-11-03 1 views
1

В настоящее время я работаю менеджером по работе на основе 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() метод?

ответ

1

Ну, решение оказалось довольно очевидным и легким. Я просто создать частный

IJobExecutionContext _context = null;

поле моего класса задания и установите его значение в contextExecute() метода.

public void Execute(IJobExecutionContext context) 
{ 
    _context = context; 
    ... 
} 

В принципе мы можем прервать только выполняющую работу, так что если Interrupt() называются чем Execute() был вызван по крайней мере один раз, чтобы этот подход, в принципе, устраивает мои потребности и обновление Иова DataMap сразу после того, как Interrupt называли.

Смежные вопросы