2013-10-10 8 views
5

JavaFX2 में WebEngine का उपयोग करते समय, मैंने देखा है कि कभी-कभी यह अटक जाता है। मान लीजिए कि मैं एक क्रॉलर बना रहा था जो कि किसी पृष्ठ पर हाइपरलिंक्स पाता है और फिर उनको एक ही बार-बार करने के लिए जाता है, इस बात का ट्रैक रखते हुए कि हमने किन लिंकों का दौरा किया है और जो पहले से ही सीमा पर हैं। मेरे कोड को चलाने के दौरान, निष्पादन कभी-कभी मनमानी क्षणों पर लटका होगा।JavaFX WebEngine "रनिंग" स्थिति में फंस गया

मैं workDoneProperty और exceptionProperty को श्रोताओं के रूप में और loadWorker के stateProperty के हर संक्रमण मुद्रण द्वारा अपने प्रोजेक्ट के लिए कुछ डिबग कोड जोड़ दिया है। तब मैंने देखा कि कभी-कभी इंजन यूआरएल के मध्य लोडिंग को रोक देगा (राज्य RUNNING में फंस गया है और workDone अपडेट नहीं हैं)। मुझे लगता है कि यह एक समय या कुछ के कारण है, लेकिन मैंने यह देखने के लिए इंतजार करना बंद कर दिया है कि यह वास्तव में 5 मिनट के बाद एक टाइमआउट है या नहीं।

exceptionProperty किसी भी घटनाओं उत्पन्न करने के लिए प्रतीत नहीं होता है और न ही FAILED या CANCELLED में webEngine संक्रमण करता है, यह सिर्फ बंद हो जाता है। मैं सोच रहा हूं कि क्या यह पुस्तकालय में संभावित रूप से दौड़ की स्थिति है या शायद कुछ ऐसा है जो मुझे याद आ रहा है ... क्या किसी को इसका सामना करना पड़ा है जो जानता है कि इसे कैसे ठीक किया जा सकता है? मेरे कंसोल से जोड़ा उत्पादन: यह काफी मेरे ऐप है कि इंजन सिर्फ 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 उदाहरण के लिए एक स्थिर चर का उपयोग करके (है कि मैं एक 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 एक ही साइट लोड करने का प्रयास । समाधान प्रत्येक पृष्ठ को खाली पृष्ठ के बाद/पहले लोड करना है। जब तक कि आप पहले से ही रिक्त पृष्ठ पर नहीं हैं।

मैं जावाफाक्स वेबइंजिन के साथ क्रॉलर लिखने की अनुशंसा नहीं करता हूं। गंभीरता से गड़बड़ है। (मुझे पता है, मैंने इसे विश्वविद्यालय प्रोजेक्ट के लिए किया था)

यदि आप लोड पेज का उपयोग करते हैं तो समवर्ती रूप से परमाणु संदर्भ का उपयोग करते हैं।

पहले से लिखे गए वेबक्रॉलर के लिए संदर्भ: https://github.com/llde/crawly

संबंधित मुद्दे