Как включить и отключить индикатор выполнения при использовании JMS в javafx8

в действии я отправляю сообщение в тему jms для обработки данных, и у меня есть метод обратного вызова, который вызывается, когда данные готовы, и загружает TableView.

public void onEnter(ActionEvent actionEvent) throws IOException, InterruptedException {
            new Thread() {
                public void run() {
                    Platform.runLater(() -> {
                        progressIndicator.setVisible(true);
                        scrollPane.setDisable(true);
                    });


                    //  Construct the message and publish it to a topic

                };
            }.start();

        } 
    }



public void callBackMethod(List<Object>  list )  {

        progressIndicator.setVisible(false);
        scrollPane.setDisable(false);
    //load data in the table
}

Это делает то, что я хочу, но что, если что-то пойдет не так на стороне системы обмена сообщениями, обратный вызов никогда не будет вызван, и компонент пользовательского интерфейса будет отключен навсегда.

Любые предложения по улучшению этого будут полезны.


person user68883    schedule 04.04.2016    source источник


Ответы (1)


Предположительно, система обмена сообщениями выдаст какое-то исключение, если ей не удастся отправить сообщение, поэтому вам понадобится способ отловить это и правильно восстановиться. Если вы используете класс «Задача» JavaFX, вы получите события, когда это произойдет. Вам все равно придется иметь дело со сбоем на принимающей стороне или реализовать какой-то тайм-аут, если это уместно.

Кроме того, вы запускаете поток, а затем сразу же перебрасываете задание на FXAT с помощью RunLater. Обработчик события onEnter, по определению, уже запущен на FXAT, так что вы можете просто выполнить свои действия с графическим интерфейсом, прежде чем запускать поток (или Task, как я предлагаю). Вот пример, показывающий, как запустить задачу и очистить ее в случае сбоя с исключением:

public class SampleTask extends Application {

public static void main(String[] args) {
    launch(args);
}

@Override
public void start(Stage primaryStage) {
    primaryStage.setTitle("Hello World!");

    BorderPane root = new BorderPane();
    ProgressIndicator progressIndicator = new ProgressIndicator(0);
    ScrollPane scrollPane = new ScrollPane();
    Button button = new Button("Start");
    root.setTop(progressIndicator);
    root.setCenter(scrollPane);
    progressIndicator.setVisible(false);
    root.setBottom(button);
    primaryStage.setScene(new Scene(root, 300, 250));
    primaryStage.show();

    button.setOnAction(actionEvent -> {
        progressIndicator.setVisible(true);
        scrollPane.setDisable(true);
        Task<Void> testTask = new Task<Void>() {
            @Override
            protected Void call() throws Exception {
                // Send the message
                return null;
            }
        };
        testTask.setOnFailed(event -> {
            progressIndicator.setVisible(false);
            scrollPane.setDisable(false);
        });
        new Thread(testTask).start();
    });
}

}

person DaveB    schedule 05.04.2016
comment
Спасибо за предложение, если я правильно его понимаю, setOnFailed вызывается, когда происходит сбой при отправке/обработке сообщения в систему обмена сообщениями, и система обмена сообщениями может вернуть ошибку вызывающему абоненту. Если эта фаза проходит нормально без каких-либо проблем, то на принимающей стороне у меня должно быть какое-то поведение тайм-аута. - person user68883; 06.04.2016
comment
В основном правильно. Для всех практических целей setOnFailed вызывается, когда метод call() задачи вызывает исключение. Итак, если у вас есть ошибка в обмене сообщениями, которую вы действительно можете получить и обработать в коде метода call(), тогда будет вызван setOnSuccess. В этом случае, возможно, вместо того, чтобы call() (и Task) возвращали Void, он может вернуть что-то более значимое, с чем вы можете справиться в методе setOnSuccess. Помните, что код onFail и onSuccess выполняется на FXAT. - person DaveB; 06.04.2016
comment
Понял. Спасибо - person user68883; 06.04.2016