【问题标题】:JavaFX WebEngine stuck in "Running" stateJavaFX WebEngine 卡在“运行”状态
【发布时间】:2013-10-18 09:19:42
【问题描述】:

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

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

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

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

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)

【问题讨论】:

    标签: java javafx javafx-webengine


    【解决方案1】:

    我也遇到了同样的问题。 似乎它发生在我在方法中创建了一个本地“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();
        }
    }
    

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-11
        • 2020-11-06
        • 1970-01-01
        • 1970-01-01
        • 2013-07-07
        相关资源
        最近更新 更多