首页 > 解决方案 > 如果发生异常,如何在 Executor 服务中停止 Callable 任务

问题描述

我正在尝试实现一个示例应用程序来测试 Callable 和 ExecutorService 接口。

在我的应用程序中,我有:

@Bean("fixedThreadPool")
public ExecutorService fixedThreadPool() {
    return Executors.newFixedThreadPool(5);
}

然后:

public void removeUserIds(Set<String> userIds) {
 UriComponentsBuilder builder = UriComponentsBuilder.fromUriString("http://localhost:8080/remove");
    final List<Callable<String>> callables = new ArrayList<>();  
    userIds.forEach(userId -> {
        final Callable<String> task = () -> callServiceToRemove(builder,userId); //Call to remote service using RestTemplate
        callables.add(task);
    });

    try {
        final List<Future<String>> futureList =
            executor.invokeAll(callables);

        futureList.forEach(future -> {
            try {
                log.info(future.get());
            } catch (final Exception e) {
                log.error("Error : "+ e.getMessage());
            } 
        });
    } catch (final Exception e) {
        log.error("Error Error Error : "+ e.getMessage());
    } finally {
        executor.shutdown();
    }
}

当我使用 100 个用户 ID 调用 removeUserIds() 方法时,它在快乐流程中工作正常,但如果服务不可用或关闭,则会第 100 次打印错误。如果服务不可用或关闭,我无法停止/终止线程,因此服务不会发生进一步的调用。任何人都可以在这里帮助解决这个问题,如果服务关闭,我如何停止线程执行,或者在这里提出可行的解决方案?

标签: javaspringconcurrencyexecutorservicejava.util.concurrent

解决方案


在 try catch 块中移动 callServiceToRemove 调用。

在 catch 块中,您可以使用 executor.shutdownNow();

shutdownNow()尝试停止所有正在执行的任务,停止等待任务的处理,并返回等待执行的任务列表。此方法不等待主动执行的任务终止并尝试强制停止它们。除了尽最大努力停止处理正在执行的任务之外,没有任何保证。此实现通过 Thread.interrupt() 取消任务,因此任何未能响应中断的任务可能永远不会终止。


推荐阅读