gpt4 book ai didi

java - 在 spring boot Rest API 中关闭 ExecutorService

转载 作者:行者123 更新时间:2023-11-30 07:41:00 26 4
gpt4 key购买 nike

我正在构建部署在 weblogic 12c 上的 spring boot rest api 应用程序。我的要求之一是对每个传入请求运行一些长时间运行的任务。传入的休息请求可能会导致多个异步任务执行。

因为我不关心响应,也不关心这些任务会导致的任何异常,所以我选择使用 ExecutorService 而不是 Callable 或 CompletableFuture。

ExecutorService executorService =
Executors.newFixedThreadPool(2, new CustomizableThreadFactory("-abc-"));

然后对于我在 Controller 中收到的传入请求,运行两个 for 循环并将这些任务分配给 ExecutorService:

for (final String orderId : orderIds) {
for (final String itemId : itemIds) {
exec.execute(new Runnable() {
public void run() {
try {
//call database operation
}catch(Throwable t) {
logger.error("EXCEPTION with {} , {}" ,orderId,itemId
)
}
});
}//for
}//for

我的问题是关于关闭 ExecutorService。我知道正常关机 ( shutdown ) 混合关机 ( awaitTermination ) 或突然关机 ( shutdownNow )

对于 rest api 应用程序,这三种方法之间的首选方法是什么?

对于可以创建多少个线程池也有任何限制,因为创建的 ExecutorService 线程池的数量将由传入请求的数量驱动

最佳答案

我们目前有类似的要求,这是一个很难解决的问题,如果你愿意的话,你想使用合适的锤子。有非常重量级的解决方案来编排长时间运行的进程,例如 SpringBatch。

首先,不要费心停止和启动 ExecutorService。该类的全部意义在于减轻线程管理的负担,因此您无需自己创建和停止线程。所以你不需要管理经理。

但是要小心你的方法。无需使用队列或其他负载平衡技术来巧妙地平衡应用程序中跨实例的长时间运行的进程。或者管理线程终止时发生的事情,您可能会遇到麻烦。总的来说,我会说现在直接与线程或线程池交互并使用更高级别的解决方案来解决此类问题没有多大意义。

关于java - 在 spring boot Rest API 中关闭 ExecutorService,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56696065/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com