JavaFX2: Posso pausar uma tarefa / serviço em segundo plano?

Eu estou tentando configurar um serviço de plano de fundo que executaria o carregamento em massa de dados de transação de um arquivo csv. Este serviço de segundo plano seria iniciado a partir de uma ação de item de menu mapeada para um método na class do controlador / apresentador.

Sempre tão frequentemente, alguns dados aparecem no arquivo csv para o qual nenhum dado mestre pode ser encontrado no database, isso normalmente faria com que o upload afogasse e falhasse.

Nessas ocasiões, gostaria de poder fazer com que o serviço de segundo plano pause seu processamento e invoque um diálogo de uma class de apresentador para receber a input do usuário. A input do usuário seria usada para adicionar uma linha mestre no database, após o qual o serviço em segundo plano deveria continuar de onde havia parado (não do início do arquivo csv, mas da linha que causou o erro).

Isso é possível no JavaFX, talvez com a API javafx.concurrent? Como eu iria fazer isso?

Solução

Quando o processo de segundo plano encontra uma situação em que requer que um usuário receba uma input, use FutureTask executado em Platform.runLater para mostrarAndWait o prompt de diálogo no encadeamento do aplicativo JavaFX. No processo de segundo plano, use futureTask.get para pausar o processo em segundo plano até que o usuário tenha inserido os valores necessários que permitirão que o processo continue.


Fragmento de código de amostra

Aqui está a essência do código para essa abordagem que pode ser colocada dentro do método de chamada do seu processo em segundo plano:

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(); } ... } 

Aplicativo de Amostra

Eu criei um aplicativo de amostra pequeno e completo para demonstrar essa abordagem.

A saída do aplicativo de amostra é:

promptingtaskdemooutput

Explicação da saída de amostra

Linhas lidas sem valores ausentes são simplesmente marrons. As linhas com um valor de prompt inserido têm um fundo verde claro. Quatorze linhas foram lidas, a tarefa em segundo plano já foi pausada uma vez na sexta linha que estava faltando um valor. O usuário foi solicitado para o valor ausente (para o qual o usuário digitou xyzzy ), em seguida, o processo continuou até a linha 14 que também está ausente e a tarefa em segundo plano é novamente pausada e outra checkbox de diálogo de prompt está sendo exibida.