2013-10-10 7 views
5

JavaFX2でWebEngineを使用している間に、私は気付いたことがあります。私は単にページ上のハイパーリンクを見つけて、そのリンクを訪問して同じ再帰的に行うクローラを作って、私たちが訪れたリンクと既にフロンティアにいるリンクを追跡していると仮定します。私のコードを実行している間、実行は時々任意の瞬間にハングすることがありました。JavaFX WebEngineが「実行中」の状態になっています

workDonePropertyexceptionPropertyのリスナーの形式で、そしてloadWorkerstatePropertyのすべてのトランジションを印刷することで、プロジェクトにデバッグコードを追加しました。その後、エンジンがURLの途中でロードを停止することがあることに気付きました(状態はRUNNINGに固執しており、それ以上の更新はありません)。私はこれがタイムアウトか何かのためだと仮定していますが、実際に5分後にタイムアウトしたかどうかを確認するのをやめました。

exceptionPropertyは、イベントを生成していないようでもなく、FAILEDまたはCANCELLEDに移行しても、それは停止しません。私はこれが潜在的に図書館の競合状態になっているのか、それとも私が見逃しているものがあるのだろうかと疑問に思っています...これがどのように修正できるのか分かっている人は誰ですか?私のコンソールからの追加出力:それは私のエンジンがちょうどrandomnly停止しないアプリ...

EDITのために非常に重要です私は同じ問題が発生しました

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) 

答えて

3

。 メソッド内でローカルの「WebView」インスタンスを作成したときに、そのメソッドがハードリファレンスを保持していない場合に発生したようです(0120)。

問題を修正しました。私のWebViewのインスタンスの静的変数を使用して(私はJavaFXのスレッドで初期化してること - そう、私は例外を取得)

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

WebEngineあなたが二回sequientially同じサイトをロードしようとしたときの状態を実行中に立ち往生したまま。 解決策は、すべてのページの後/前に空白ページを読み込むことです。すでに空白のページに入っていない限り。

JAvaFX WebEngineでクローラを作成することはお勧めしません。真剣に盗んだ。 (私は大学のプロジェクトでやったことが分かります)

また、ロードページを同時に使用する場合は、AtomicReferenceを使用してください。

既に書かれているWebCrawlerの参照先:https://github.com/llde/crawly

関連する問題