Обрабатывать JobExecutionException в Quartz.net - PullRequest
20 голосов
/ 14 июля 2010

Вероятно, глупый вопрос ... но здесь все равно ...

Я настроил кварц и могу планировать задания, и я могу подтвердить, что задания (реализующие интерфейс IJob) работают.

Глядя на документацию на сайте, (Урок 3 учебного пособия):

Единственный тип исключения, которое вам разрешено выбрасывать из метода execute - JobExecutionException.

Мне бы хотелось, чтобы, когда возникает исключение, которое я не обработал явно, оно должно выдать исключение JobExecutionException, чтобы я мог зарегистрировать его в «родительском» приложении.Я обернул свой код в try catch и сгенерировал исключение JobExecutionException, но теперь, где его обработать?

Я нигде не вызываю метод execute, который обрабатывается Quartz (в отдельном потоке),Итак, как мне справиться с этой ошибкой, когда она возникает.Я действительно не хочу проглотить ошибку в работе

Ответы [ 3 ]

16 голосов
/ 31 декабря 2011

Я решил эту проблему с помощью базового класса, чтобы перехватить все исключения:

public abstract class JobBase : IJob
{
    protected JobBase()
    {
    }

    public abstract void ExecuteJob(JobExecutionContext context);

    public void Execute(JobExecutionContext context)
    {
        string logSource = context.JobDetail.FullName;

        try
        {
            ExecuteJob(context);
        }
        catch (Exception e)
        {
           // Log exception
        }
    }
}

Ваш класс Job должен выглядеть следующим образом:

public class SomeJob : JobBase
{
    public SomeJob()
    {
    }

    public override void ExecuteJob(JobExecutionContext context)
    {
        // Do the actual job here
    }
}
12 голосов
/ 13 июля 2011

Обычно вы устанавливаете метод выполнения вашей работы следующим образом:

try
{
    // the work you want to do goes here
}
catch (ExceptionTypeYouWantToHandle1 ex1)
{
    // handle exception
}
catch (ExceptionTypeYouWantToHandle2 ex2)
{
    // handle exception
}
// and so on
catch (Exception ex)
{
    // something really unexpected happened, so give up
    throw new JobExecutionException("Something awful happened", ex, false); // or set to true if you want to refire
}

В этот момент сам планировщик будет регистрировать исключение, куда бы он ни записывал (в зависимости от конфигурации).

7 голосов
/ 07 ноября 2012

Как уже упоминалось, правильный способ "обнаружения" исключений JobExecutionException на глобальном уровне заключается в реализации и регистрации IJobListener и проверке, имеет ли параметр JobExecutionException в методе JobWasExecuted () значение! = Null.

Однако проблема, с которой я столкнулся (и, судя по дополнительному комментарию ОП, с ним тоже столкнулся), заключалась в том, что Quartz не обрабатывал исключение JobExecutionException (как и должно быть), что приводило к необработанному исключению, убивающему приложение.

До сих пор я использовал предварительно скомпилированную DLL из пакета выпуска Quartz.NET 2.0.1 (.NET3.5). Чтобы докопаться до сути проблемы, я сослался на проект / исходный код Quartz и, к моему удивлению, он вдруг заработал ?!

Интересно, что это код библиотеки Quartz , который выполняет IJob и обрабатывает исключение JobExecutionException:

try {
    if (log.IsDebugEnabled) {
       log.Debug("Calling Execute on job " + jobDetail.Key);
    }
    job.Execute(jec);
    endTime = SystemTime.UtcNow();
} catch (JobExecutionException jee) {
    endTime = SystemTime.UtcNow();
    jobExEx = jee;
    log.Info(string.Format(CultureInfo.InvariantCulture, "Job {0} threw a JobExecutionException: ", jobDetail.Key), jobExEx);
} catch (Exception e) {
   // other stuff here...
}

Следующим шагом была прямая ссылка на мою недавно скомпилированную DLL, и это тоже работало. К сожалению, я не могу сказать вам, почему это работает, и в настоящее время у меня нет времени вдаваться в подробности, но, возможно, это кому-то поможет. Может быть, кто-то еще может подтвердить это и даже дать объяснение. Это может быть связано с разными целевыми платформами (x86 / 64bit)?

...