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())
}
}
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…