未捕获的异常对Quartz的SimpleThreadPool中的线程的影响

时间:2012-07-20 07:26:08

标签: java spring threadpool quartz-scheduler worker-thread

将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)**

1 个答案:

答案 0 :(得分:5)

JobRunShell类是一个执行作业的沙箱。它包含一个catch (Throwable)子句,用于捕获不是JobExecutionException的所有内容并记录错误。无论如何,工作线程都会返回池中。

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

据说Quartz documentation明确建议不要将任何例外情况排除在工作之外,JobExecutionException除外:

  

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