6

在 JavaFX2 中使用WebEngine时,我注意到它有时会卡住。假设我正在制作一个爬虫,它只是在页面上找到超链接,然后递归地访问它们以执行相同的操作,跟踪我们访问过哪些链接以及哪些链接已经在边界上。在运行我的代码时,执行有时会在任意时刻挂起。

我以监听器的形式向我的项目添加了一些调试代码,workDonePropertyexceptionProperty打印了loadWorker's 的每个转换stateProperty。然后我注意到有时引擎会停止 URL 的中间加载(状态被卡住RUNNING并且没有更多workDone更新)。我假设这是因为超时或其他原因,但我已经停止等待 5 分钟后是否确实超时。

exceptionProperty似乎没有产生任何事件,也没有过渡webEngineFAILEDor CANCELLED,它只是停止。我想知道这是否可能是图书馆中的竞争条件,或者我可能缺少一些东西......有没有人遇到过这个知道如何解决这个问题的人?对于我的应用程序来说,引擎不只是随机停止是非常重要的......

编辑:从我的控制台添加输出:

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)
4

2 回答 2

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();
    }
}
于 2014-04-16T07:19:20.580 回答
0

当您尝试按顺序加载同一站点两次时,WebEngine 仍停留在运行状态。解决方案是在每个页面之后/之前加载空白页面。除非你已经在空白页上。

我不建议使用 JAvaFX WebEngine 编写爬虫。被严重窃听。(我知道,我是为大学项目做的)

此外,如果您同时使用加载页面,请使用 AtomicReference。

已编写的 WebCrawler 的参考:https ://github.com/llde/crawly

于 2016-10-07T14:38:27.837 回答