java - 如果发生异常,如何在 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 次打印错误。如果服务不可用或关闭,我无法停止/终止线程,因此服务不会发生进一步的调用。任何人都可以在这里帮助解决这个问题,如果服务关闭,我如何停止线程执行,或者在这里提出可行的解决方案?
解决方案
在 try catch 块中移动 callServiceToRemove 调用。
在 catch 块中,您可以使用 executor.shutdownNow();
shutdownNow()尝试停止所有正在执行的任务,停止等待任务的处理,并返回等待执行的任务列表。此方法不等待主动执行的任务终止并尝试强制停止它们。除了尽最大努力停止处理正在执行的任务之外,没有任何保证。此实现通过 Thread.interrupt() 取消任务,因此任何未能响应中断的任务可能永远不会终止。
推荐阅读
- python-3.x - 结果得到“无”,不明白为什么
- python - 分类回归的最佳指标?
- flowtype - 为什么 Flow 中的 window.getComputedStyle 返回 `any` 类型?
- boost - 期望 char_ 解析器的序列和交替来合成一个字符串
- javascript - I am not hitting my api route in backend controller from angular frontend. What am I doing incorrect?
- python - Sort multiple columns' values from min to max, and put in new columns in pandas dataframe
- semantic-segmentation - 在 fastai 第 3 课-camvid.ipynb 示例中,不同图像中相同标签的掩码代码显示不同。这是一个问题吗?
- html - How can I style
- c# - Uncaught signal: 11 when using .net Core Cloud Firestore in Google Cloud
- javascript - Filtering out items from an API call if they share the same value on a key