2

我正在使用 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();?请帮我?

谢谢!

4

1 回答 1

2

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

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

@Override
public void run() {
    try {
        doPrintTaskStuff();
    } catch (Throwable t) {
        sendEmailAboutException(t);
    }
} 
于 2013-09-05T10:28:22.470 回答