JavaFX2: Могу ли я приостановить фоновое задание / службу?
Я пытаюсь настроить фоновый сервис, который будет выполнять массовую загрузку данных транзакций из файла csv. Эта фоновая служба будет инициирована из действия элемента меню, сопоставленного с методом в classе controllerа / презентатора.
Когда-либо так, некоторые данные появляются в файле csv, для которого в базе данных не могут быть найдены core data, это обычно приводит к сбою и сбою загрузки.
В таких случаях я хотел бы иметь возможность фоновой службы приостанавливать ее обработку и вызывать диалог из classа презентатора для ввода пользовательского ввода. Пользовательский ввод будет использоваться для добавления мастер-строки в базе данных, после чего служба фона должна возобновиться с того места, где она была остановлена (не с начала файла csv, а из строки, которая вызвала ошибку).
- Связаны ли статические переменные между streamами?
- Простые числа Eratoshenes быстрее последовательны, чем одновременно?
- Что будет использоваться для обмена данными между streamами, выполняются на одном ядре с HT?
- Как вы запрашиваете pthread, чтобы узнать, все ли работает?
- Когда я должен использовать CompletionService над ExecutorService?
Можно ли это достичь в JavaFX, возможно, с помощью javafx.concurrent API? Как мне это сделать?
- Связаны ли в LinkedBlockingQueue методы удаления и удаления?
- Что такое состояние гонки?
- Можем ли мы иметь условия гонки в однопоточной программе?
- Может ли современное оборудование x86 не хранить один байт в памяти?
- Несинхронизированные статические методы streamобезопасны, если они не изменяют переменные статического classа?
- На какой уровень блокирует MongoDB запись? (или: что это означает «за соединение»,
- Когда и как следует использовать переменную ThreadLocal?
- Как эта `this` ссылка на внешний class исчезает из-за публикации экземпляра внутреннего classа?
Решение
Когда ваш фоновый процесс сталкивается с ситуацией, когда требуется, чтобы пользователь запрашивался для ввода, используйте FutureTask, выполненный в Platform.runLater, чтобы показатьAndWait диалоговое приглашение в streamе приложений JavaFX. В фоновом процессе используйте futureTask.get, чтобы приостановить фоновый процесс, пока пользователь не введет необходимые значения, которые позволят продолжить процесс.
Пример fragmentа кода
Вот суть кода для этого подхода, который может быть помещен внутри метода вызова вашего фонового процесса:
String nextText = readLineFromSource(); if ("MISSING".equals(nextText)) { updateMessage("Prompting for missing text"); FutureTask futureTask = new FutureTask( new MissingTextPrompt() ); Platform.runLater(futureTask); nextText = futureTask.get(); } ... class MissingTextPrompt implements Callable { private TextField textField; @Override public String call() throws Exception { final Stage dialog = new Stage(); dialog.setScene(createDialogScene()); dialog.showAndWait(); return textField.getText(); } ... }
Пример приложения
Я создал небольшое, полное примерное приложение, чтобы продемонстрировать этот подход.
Выходной пример приложения-примера:
Пример вывода Объяснение
Строки, считанные без пропущенных значений, просто коричневые. Строки с введенным быстрым значением имеют бледно-зеленый фон. Четырнадцать строк были прочитаны, фоновая задача уже приостановлена на 6-й строке, где отсутствует значение. Пользователю было предложено xyzzy
отсутствующее значение (к которому пользователь xyzzy
), затем процесс продолжался до строки 14, которая также отсутствует, а фоновая задача снова приостановлена и отображается другое диалоговое окно приглашения.