首页 > 解决方案 > 如何在提供给 CompletableFuture 的 ExecutorService 上调用关闭?

问题描述

我每 15 分钟运行一次批处理作业,在那里我获取 5 个不同事件的记录并将它们推送到 API,最终在移动设备上作为推送通知发出。

我正在使用 Java 8,带有 Quartz 调度程序的 Spring Boot 应用程序。

我有一个服务类,它从属性文件中读取不同的事件类型并循环访问这些事件类型,并通过工厂创建 5 个不同的控制器来处理这 5 个事件中的每一个。

我的问题是我在哪里调用 executor.shutdown 来关闭 ExecutorService?

这是我的程序的基本结构:

 public class ServiceImpl {

    ExecutorService executor = Executors.newFixedThreadPool(10);

    for (Event event: eventTypes)
        
        
        EventController eventController = eventFactory.createEventController(event);
        eventController.executeTasks(executor);
                
        
    }
}


public interface EventController {
    
    EventBean executeTasks(ExecutorService executor);
    
    EventBean transform1();
    EventBean transform2(); 
}



public class EventController1 implements EventController {



    public EventBean executeTasks(ExecutorService executor) {


        CompletableFuture<List<Event1>> cf1 = CompletableFuture.supplyAsync(() -> {
                        
                //db call 1
                                        
        }, executor);
                
                
        CompletableFuture<EventBean1> combinedFuture = cf1
                .thenCombineAsync(() -> {

                //db call 2, independent from 1, hence called async

        });

        combinedFuture
        .thenApply(e -> transform1())
        .thenApply(e -> transform2())

    }   

}


public class EventController2 implements EventController {



    public EventBean executeTasks(ExecutorService executor) {


        CompletableFuture<List<Event2>> cf1 = CompletableFuture.supplyAsync(() -> {
                        
                //db call 1
                                        
        }, executor);
                
                
        CompletableFuture<EventBean1> combinedFuture = cf1
                .thenCombineAsync(() -> {

                //db call 2, independent from 1, hence called async

        });

        combinedFuture
        .thenApply(e -> transform1())
        .thenApply(e -> transform2())

    }   

}


public class EventController3 implements EventController {



    public EventBean executeTasks(ExecutorService executor) {


        CompletableFuture<List<Event3>> cf1 = CompletableFuture.supplyAsync(() -> {
                        
               //db call 1
                                        
        }, executor);
                
                
        CompletableFuture<EventBean1> combinedFuture = cf1
                .thenCombineAsync(() -> {

                //db call 2, independent from 1, hence called async

        });

        combinedFuture
        .thenApply(e -> transform1())
        .thenApply(e -> transform2())

    }   

}

标签: javaspringexecutorserviceshutdowncompletable-future

解决方案


推荐阅读