Влияние необработанных исключений на потоки из Quar's SimpleThreadPool

Использование API интеграции Spring с Quartz, как это повлияет на работу cron, у которой есть неперехваченные исключения? Поскольку поток cronbean / worker не перехватил исключение, это будет означать, что поток мертв и не сможет вернуться к SimpleThreadPool? Если он мертв и не возвращается в пул, это будет означать, что SimpleThreadPool потребуется для создания новых потоков, если, скажем, это происходит несколько раз, таким образом, опустошая пул?

Это пример трассировки стека:

org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean$MethodInvokingJob.executeInternal(MethodInvokingJobDetailFactoryBean.java:276) - Invocation of method 'doCronJob' on target class [abc.package.ServiceImpl] failed
java.io.FileNotFoundException: http://www.website.com
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1457)
    at abc.package.ServiceImpl.doCronJob(ServiceImpl.java:453)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.springframework.util.MethodInvoker.invoke(MethodInvoker.java:283)
    at org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean$MethodInvokingJob.executeInternal(MethodInvokingJobDetailFactoryBean.java:272)
    at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:86)
    at org.quartz.core.JobRunShell.run(JobRunShell.java:208)
    **at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:520)**

1 ответ

Решение

JobRunShell класс - это песочница, в которой происходит выполнение задания. Он содержит catch (Throwable) пункт, который ловит все, что не является JobExecutionException и регистрирует ошибку. Рабочие потоки возвращаются в пул в любом случае.

Таким образом, ответ - нет, необработанные исключения не нарушают пулы потоков кварца. Реализации триггера могут вести себя иначе (например, не планировать или удалять триггер) в executionComplete метод.

Тем не менее, документация Quartz явно рекомендует не выбрасывать исключения из вашей работы, кроме JobExecutionException:

Наконец, нам нужно проинформировать вас о некоторых деталях метода Job.execute (..). Единственный тип исключения (включая RuntimeExceptions), который вы можете выбросить из метода execute, - это JobExecutionException. Из-за этого вы должны обычно обернуть все содержимое метода execute блоком try-catch. Вам также следует потратить некоторое время на просмотр документации для JobExecutionException, поскольку ваша работа может использовать ее для предоставления планировщику различных указаний относительно того, как вы хотите, чтобы исключение обрабатывалось.

Другие вопросы по тегам