2013-10-10 9 views
5

Durante l'utilizzo di WebEngine in JavaFX2, ho notato che a volte rimane bloccato. Supponiamo che stavo facendo un crawler che trova semplicemente i collegamenti ipertestuali su una pagina e poi li visita per fare lo stesso in modo ricorsivo, tenendo traccia di quali link abbiamo visitato e quali sono già sulla frontiera. Durante l'esecuzione del mio codice, l'esecuzione a volte si blocca in momenti arbitrari.JavaFX WebEngine bloccato nello stato "In esecuzione"

ho aggiunto un po 'di codice di debug al mio progetto, sotto forma di ascoltatori al workDoneProperty e exceptionProperty e stampando ogni transizione del loadWorker s' stateProperty. Poi ho notato che a volte il motore si fermava a metà caricamento di un URL (lo stato è bloccato in RUNNING e non ci sono più aggiornamenti workDone). Suppongo che questo sia dovuto a un timeout o qualcosa del genere, ma ho smesso di aspettare per vedere se è davvero un timeout dopo 5 minuti.

Il exceptionProperty non sembra generare eventi né il passaggio in webEngineFAILED o CANCELLED, si ferma solo. Mi chiedo se questa è potenzialmente una condizione di competizione in biblioteca o forse c'è qualcosa che mi manca ... Qualcuno ha incontrato questo che sa come può essere risolto? E 'molto importante per la mia app che il motore non si ferma randomnly ...

EDIT: aggiunto uscita dalla mia console:

Work done: -1 
Engine Load Worker transitioning into state: READY 
Work done: 0 
Engine Load Worker transitioning into state: SCHEDULED 
Engine Load Worker transitioning into state: RUNNING 
Work done: 21 
Work done: 24 
Work done: 24 
Work done: 57 
Work done: 72 
BUILD STOPPED (total time: 9 minutes 32 seconds) 

risposta

3

che ho incontrato lo stesso problema. Sembra che sia successo quando ho creato un'istanza locale "WebView" all'interno di un metodo senza tenere un riferimento rigido (quindi dopo la chiamata al metodo era probabilmente GC-ed.)

Ho risolto il problema utilizzando una variabile statica per il mio esempio WebView (che sto inizializzazione in un thread JavaFX - altrimenti ottengo un'eccezione)

private static WebView webview; 
public static void someMethod() { 


    try { 
     if (webview == null){ 
      webview = new WebView(); 
     } 
     WebEngine webEngine = webview.getEngine(); 
     webEngine.getLoadWorker().stateProperty().addListener(
       new ChangeListener<State>() { 
        public void changed(ObservableValue ov, State oldState, State newState) { 
         System.out.println("newState = " + newState); 
         if (newState == State.SUCCEEDED) { 
          System.out.println(webEngine.getLocation()); 
         } 
        } 
       }); 
     webEngine.load("http://javafx.com"); 
    } catch (Exception ex) { 
     System.err.print("error " + ex.getMessage()); 
     ex.printStackTrace(); 
    } 
} 
0

il WebEngine rimangono bloccati in esecuzione quando si tenta di caricare lo stesso sito due volte sequientially . La soluzione è caricare dopo/prima di ogni pagina la pagina vuota. A meno che tu non sia già sulla pagina vuota.

Non è consigliabile scrivere un crawler con JAvaFX WebEngine. È seriamente disturbato. (lo so, l'ho fatto per un progetto universitario)

Anche se si utilizzano le pagine di caricamento contemporaneamente si utilizza un AtomicReference.

Riferimento per un WebCrawler già scritto: https://github.com/llde/crawly

Problemi correlati