将Spring的集成api与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)**
答案 0 :(得分:5)
JobRunShell
类是一个执行作业的沙箱。它包含一个catch (Throwable)
子句,用于捕获不是JobExecutionException
的所有内容并记录错误。无论如何,工作线程都会返回池中。
所以,答案是否定的,未处理的异常不会破坏Quartz线程池。触发器实现可能在executionComplete
方法中表现不同(例如,取消计划或删除触发器)。
据说Quartz documentation明确建议不要将任何例外情况排除在工作之外,JobExecutionException
除外:
最后,我们需要告诉你一些Job.execute的详细信息(..) 方法。唯一的异常类型(包括RuntimeExceptions) 你被允许从execute方法中抛出是 JobExecutionException。因此,你通常应该包装 带有'try-catch'块的execute方法的全部内容。您 还应该花一些时间查看文档 JobExecutionException,因为您的作业可以使用它来提供调度程序 关于如何处理异常的各种指令。