java - 在 spring boot Rest API 中关闭 ExecutorService

标签 java spring multithreading weblogic executorservice

我正在构建部署在 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/

相关文章:

java - jsoup 干净的 html 实体

java - 允许在 Ubuntu 17.10 上对 Spring Boot Jar 进行低级端口访问

java - axis.getCategories().remove(index number) 在 JavaFX 图表中不起作用

java - 错误消息 : The method sort(List<T>) in the type Collections is not applicable for the arguments (ArrayList<Date>)

Spring 模块缓存不起作用......默默地

java - 如何使用 thymeleaf 在具有动态列的数据表中显示输入值

python-3.x - 多线程请求 Python3

java - 将整数传递给java中的运行线程

multithreading - 对于CPU调度或中断,CPU会不会执行完当前指令?

java - Spring依赖注入(inject)解决什么问题?