Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
4.3k views
in Technique[技术] by (71.8m points)

java - How to call shutdown on an ExecutorService that has been supplied to a CompletableFuture?

I am running a batch job every 15 minutes, where I get records for 5 different events and push them out to an API to eventually go out as Push Notifications on a mobile device.

I am using Java 8, Spring boot application with Quartz scheduler.

I have a service class which reads the different event types from a property file and loops over those and creates 5 different controllers via a Factory to handle each of these 5 events.

My question is where do I call executor.shutdown to shutdown the ExecutorService?

Here is the basic structure of my program:

 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())

    }   

}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)
等待大神解答

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...