package concurrent; import javafx.application.Application; import javafx.concurrent.Task; import javafx.concurrent.WorkerStateEvent; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.ProgressIndicator; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.stage.Stage; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import static com.google.common.collect.Lists.newArrayList; import static concurrent.WorthToObserver.adapt; public class BackgroundJobs extends Application { public static void main(String[] arguments) { launch(arguments); } private final Label messageLabel = new Label("We start in Germany"); private final Label eventTypeLabel = new Label("empty"); private final List<Leg> journey = newArrayList(new Leg("France"), new Leg("Spain"), new Leg("Portugal")); private final ProgressIndicator progressIndicator = new ProgressIndicator(); private final Task<TravelReport> task = new TravelToPortugal(journey); private final TravelService travelService = new TravelService(); private final ExecutorService executor = Executors.newFixedThreadPool(3); private final Starter taskStarter = new TaskStarter(task, executor); private final Starter serviceStarter = new ServiceStarter(travelService); private final BackgroundExecution service = new BackgroundExecution(adapt(travelService), serviceStarter, travelService); private final BackgroundExecution singleTask = new BackgroundExecution(adapt(task), taskStarter, task); private final BackgroundExecution actual = service; @Override public void start(Stage stage) throws Exception { travelService.setExecutor(executor); VBox container = new VBox(); HBox buttonBar = createButtonBar(); messageLabel.textProperty().bind(actual.messageProperty()); WorkerStatePresenter workerStatePresenter = new WorkerStatePresenter(eventTypeLabel); ProgressPresenter progressPresenter = new ProgressPresenter(progressIndicator); actual.addEventHandler(WorkerStateEvent.ANY, workerStatePresenter); actual.addEventHandler(WorkerStateEvent.ANY, progressPresenter); container.getChildren().addAll(buttonBar, messageLabel, eventTypeLabel, progressIndicator); progressIndicator.setVisible(false); stage.setScene(new Scene(container)); stage.show(); } @Override public void stop() throws Exception { executor.shutdown(); } private HBox createButtonBar() { HBox buttonBar = new HBox(); Button startTravel = new Button("start background job"); Button carBreaksDown = new Button("car breaks down"); buttonBar.getChildren().addAll(startTravel, carBreaksDown); startTravel.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent actionEvent) { runIt(); } }); carBreaksDown.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent actionEvent) { stopExecution(); } }); return buttonBar; } private void stopExecution() { actual.cancel(); } public void runIt() { travelService.journeyProperty().clear(); travelService.journeyProperty().addAll(journey); actual.start(); } }