Влияние необработанных исключений на потоки из 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, поскольку ваша работа может использовать ее для предоставления планировщику различных указаний относительно того, как вы хотите, чтобы исключение обрабатывалось.