2013-10-10 48 views
5

在JavaFX2中使用WebEngine时,我注意到它有时会卡住。假设我正在制作一个抓取工具,它只是在页面上找到超链接,然后访问它们以递归方式做同样的工作,并跟踪我们访问过哪些链接以及哪些链接已经在边界上。在运行我的代码时,执行有时会在任意时刻挂起。JavaFX WebEngine处于“正在运行”状态

我在听众的workDonePropertyexceptionProperty的形式,通过打印loadWorkerstateProperty的每一个过渡增加了一些调试代码到我的项目。然后我注意到有时引擎会停止中间加载一个URL(状态卡在RUNNING中,并且没有更多的workDone更新)。我假设这是因为超时或某事,但我已经停止等待5分钟后确实是否超时。

exceptionProperty似乎并没有产生任何事件,也不对webEngine过渡到FAILEDCANCELLED,它只是停止。我想知道这是否可能是图书馆的竞争条件,或者是我缺少的东西......有没有人遇到过这个知道如何解决这个问题的人?这是我的应用程序,该引擎并不仅仅停留randomnly ...

编辑很重要:添加产量从我的控制台:

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”实例没有保持硬引用到它(这样的方法调用结束之后 - 它可能是GC-ED)

我固定的问题通过使用一个静态变量为我的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

相关问题