1

使用 Spring 的集成 api with 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)**
4

1 回答 1

5

该类JobRunShell是一个沙箱,在其中执行作业。它包含一个catch (Throwable)子句,该子句捕获不是 a 的所有内容JobExecutionException并记录错误。在任何情况下,工作线程都会返回到池中。

所以,答案是否定的,未处理的异常不会破坏 Quartz 线程池。触发器实现在方法中的行为可能不同(例如取消计划或删除触发器)executionComplete

这就是说,Quartz 文档明确建议不要在工作中抛出任何异常,除了JobExecutionException

最后,我们需要告诉您 Job.execute(..) 方法的一些细节。允许从 execute 方法抛出的唯一异常类型(包括 RuntimeExceptions)是 JobExecutionException。因此,您通常应该使用“try-catch”块包装执行方法的全部内容。您还应该花一些时间查看 JobExecutionException 的文档,因为您的作业可以使用它来为调度程序提供各种指令,以了解您希望如何处理异常。

于 2012-07-20T07:53:06.310 回答