我正在使用Spring 2.5 ThreadPoolTaskExecutor
,如下所示。
<bean id="taskExecutor"
class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="5" />
<property name="maxPoolSize" value="10" />
<property name="WaitForTasksToCompleteOnShutdown" value="true" />
</bean>
ThreadPoolTaskExecutor taskExecutor = (ThreadPoolTaskExecutor) context.getBean("taskExecutor");
taskExecutor.execute(new PrintTask("Thread 1"));
taskExecutor.execute(new PrintTask("Thread 2"));
taskExecutor.execute(new PrintTask("Thread 3"));
taskExecutor.execute(new PrintTask("Thread 4"));
taskExecutor.execute(new PrintTask("Thread 5"));
以上代码工作正常,没有任何问题。我的问题是,ThreadPoolTaskExecutor
是异步的,这意味着它不会等到任务完成。它只是火上浇油和忘记。如果任何执行调用抛出任何异常,我需要捕获它并发送电子邮件。
为了做到这一点,我怎样才能使进程等到taskExecutor的执行方法完成后知道它是否抛出任何异常?
此外,我的配置中WaitForTasksToCompleteOnShutdown
是什么?
我什么时候可以拨打taskExecutor.shutdown();
?请帮帮我?
谢谢!
答案 0 :(得分:2)
你可以调用submit()而不是execute()并返回Future,它会告诉你是否有错误;这样做的缺点是你必须进行阻塞调用才能找到错误。
更好(或至少是更异步)的解决方案是处理PrintTask中的错误:
@Override
public void run() {
try {
doPrintTaskStuff();
} catch (Throwable t) {
sendEmailAboutException(t);
}
}