Spring ThreadPoolTask​​Executor配置?

时间:2013-09-05 10:17:27

标签: java spring spring-mvc java-ee-6 quartz-scheduler

我正在使用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>

java代码:

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();?请帮帮我?

谢谢!

1 个答案:

答案 0 :(得分:2)

你可以调用submit()而不是execute()并返回Future,它会告诉你是否有错误;这样做的缺点是你必须进行阻塞调用才能找到错误。

更好(或至少是更异步)的解决方案是处理PrintTask中的错误:

@Override
public void run() {
    try {
        doPrintTaskStuff();
    } catch (Throwable t) {
        sendEmailAboutException(t);
    }
}