2013-10-10 17 views
5

Trong khi sử dụng WebEngine trong JavaFX2, tôi đã nhận thấy nó đôi khi chỉ bị kẹt. Giả sử tôi đã tạo một trình thu thập thông tin đơn giản tìm các siêu liên kết trên một trang và sau đó truy cập các liên kết đó để thực hiện cùng một đệ quy, theo dõi liên kết nào chúng tôi đã truy cập và đã có trên biên giới. Trong khi chạy mã của tôi, việc thực thi đôi khi sẽ treo tại các thời điểm tùy ý.JavaFX WebEngine bị kẹt trong trạng thái "Đang chạy"

Tôi đã thêm một số mã gỡ lỗi vào dự án của mình dưới dạng người nghe tới workDonePropertyexceptionProperty và bằng cách in mọi chuyển đổi của's stateProperty. Sau đó, tôi nhận thấy đôi khi động cơ sẽ ngừng tải giữa một URL (trạng thái bị kẹt trong RUNNING và không có thêm workDone cập nhật). Tôi giả định điều này là do một thời gian hoặc một cái gì đó, nhưng tôi đã ngừng chờ đợi để xem nếu nó thực sự là một thời gian chờ sau 5 phút.

exceptionProperty dường như không tạo ra bất kỳ sự kiện nào và cũng không chuyển đổi webEngine thành FAILED hoặc CANCELLED, nó chỉ dừng lại. Tôi đang tự hỏi nếu điều này có khả năng là một điều kiện chủng tộc trong thư viện hoặc có thể có một cái gì đó tôi đang mất tích ... Có ai gặp phải điều này ai biết làm thế nào điều này có thể được cố định? Đó là khá quan trọng đối với ứng dụng của tôi mà động cơ không chỉ dừng lại randomnly ...

EDIT: gia tăng đầu ra từ giao diện điều khiển của tôi:

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) 

Trả lời

3

Tôi đã gặp phải vấn đề tương tự. Có vẻ như nó đã xảy ra khi tôi tạo một cá thể "WebView" cục bộ bên trong một phương thức mà không giữ một tham chiếu cứng (sau khi cuộc gọi phương thức kết thúc - có thể là GC-ed.)

Tôi đã khắc phục sự cố bằng cách sử dụng một biến tĩnh ví dụ WebView của tôi (mà tôi đang khởi tạo trong một thread JavaFX - nếu tôi nhận được một ngoại lệ)

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

các WebEngine vẫn bị mắc kẹt trong trạng thái chạy khi bạn cố gắng tải các trang web tương tự hai lần sequientially . Giải pháp là tải sau/trước mỗi trang trang trống. Trừ khi bạn đã ở trên trang trống.

Tôi không khuyên bạn nên viết trình thu thập thông tin bằng JAvaFX WebEngine. Bị lỗi nghiêm trọng. (Tôi biết, tôi đã làm điều đó cho một dự án đại học)

Ngoài ra nếu bạn sử dụng các trang tải đồng thời sử dụng AtomicReference.

Tham chiếu cho WebCrawler đã viết: https://github.com/llde/crawly

Các vấn đề liên quan