2012-02-14 82 views
0

我在我的一個Web項目中使用HtmlUnit來屏蔽一些代碼。我想知道我需要在多大程度上同步代碼。目前,我正在同步所有使用WebClient對象檢索頁面的代碼(即webClient.getPage(url))。我假設,如果webClient.getPage()不同步,那麼'瀏覽器'可能會嘗試一次加載多個頁面(糾正我,如果我錯了)。爲了解決這個問題,我可能不得不打開多個窗口,對嗎?HtmlUnit同步問題

我的問題是關於HtmlPage,HTMLTABLE等類。在檢索HtmlPage對象之後,是否需要同步從HtmlPage對象(即HtmlTable)返回的該頁面和其他對象的讀取內容,或者將整個頁面緩存到內存中?我假設它沒有被緩存,那麼如果WebClient在我操縱先前返回的HtmlPage對象時再次調用getPage(),則可能發生不好的事情。

我想有已同步控制到將返回HtmlPage,然後操縱頁面,而無需擔心同步Web客戶端調用方法Connection類。這有什麼問題嗎?

實施例:

public MyConnection { 
    private final WebClient webClient;   

    public MyConnection() { 
    this.webClient = new WebClient(); 
    this.webClient.setTimeout(10 * 1000); 
    this.webClient.setJavaScriptEnabled(false); 
    this.webClient.setCssEnabled(false); 
} 

    public synchronized HtmlPage getHtmlPage(String url) { 
     return webClient.getPage(url); 
    } 
} 



public UseConnectionClass { 
    private MyConnection conn; 

    public void getAPage(String url) { 
     return conn.getPage(url); 
    }   
} 

public ClientClass { 
    public void doSomething() { 
     UseConnectionClass useConn = new UseConnectionClass(); 
     HtmlPage page1 = useConn.getAPage("http://foobar1.com/"); 
     HtmlPage page2 = useConn.getAPage("http://foobar2.com/"); 
     // do something with page1... 
     // do something with page2... 

     page1.getElementsByTagName("table"); 
     page2.getElementsByTagName("table"); 

     // etc... 

    } 
} 

編輯:我知道Web客戶端不是線程安全,因此MyConnection的對象方法getHtmlPage()在我的例子是同步的。

+0

您是否使用多個線程,每個線程使用相同的WebClient實例? – 2012-02-14 17:56:43

+0

那麼爲什麼'synchronized'會有用呢? 'synchronized'用於防止多個線程並行執行相同的代碼塊。你只有一個線程。 – 2012-02-14 18:22:14

+0

我的錯誤。這是一個Web應用程序,所以是的,它將是多線程的。 MyConnection對象可以同時調用。 – acvcu 2012-02-14 18:53:09

回答

0

由於the javadoc說:

一個WebClient的實例不是線程安全的。它打算從單個線程使用 。

每個線程都應該有自己的Web客戶端。

+0

我已經從文檔中知道這一點。我詢問從調用WebClient獲取的對象。當我通過調用webClient.getPage()方法取回HtmlPage時,HtmlPage線程是否安全,還是處理HtmlPage對象的任何方法也需要同步? – acvcu 2012-02-14 19:27:14

+0

考慮到一個頁面被鏈接到用於獲取它的WebClient,我還會從一個線程使用它:與WebCLient所屬的線程相同的線程。 – 2012-02-14 19:34:00

+0

因此,它看起來像任何以某種方式連接到WebClient的對象必須是同步的方法,包括HtmlTables內等 – acvcu 2012-02-14 19:56:05