2012-02-14 9 views
0

Webプロジェクトの1つでHtmlUnitを使用して、コードをスクレイプするようにしています。私はコードをどの程度同期させる必要があるのか​​不思議です。現在、WebClientオブジェクトを使用してページを取得するすべてのコード(WebClient.getPage(url))を同期しています。私は、webClient.getPage()が同期されていないと、 'ブラウザ'が一度に複数のページを読み込もうとする可能性があると私は仮定します。これを回避するには、おそらく複数のウィンドウを開く必要があります。HtmlUnit同期に関する質問

私の質問は、HtmlPage、HtmlTableなどのクラスに関するものです。 HtmlPageオブジェクトを取得した後、そのページとHtmlPageオブジェクト(つまりHtmlTable)から返された他のオブジェクトの読み込みを同期させる必要がありますか、またはメモリ全体にキャッシュされたページですか?私はそれがキャッシュされていない場合、WebClientが以前に返されたHtmlPageオブジェクトを操作している間にgetPage()をもう一度呼び出すと、悪いことが起こる可能性があります。

WebClientへの呼び出しを制御するメソッドを同期させて、HtmlPageを返し、同期を心配することなくページを操作する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()が同期されています。 the javadocとして

+0

それぞれ同じWebClientインスタンスを使用する複数のスレッドを使用していますか? –

+0

それではなぜ 'synchronized'が役に立つのでしょうか? 'synchronized'は、複数のスレッドが同じコードブロックを並列に実行するのを防ぐために使用されます。あなたは1つのスレッドしか持っていません。 –

+0

私の間違い。それはウェブアプリケーションなので、マルチスレッドになります。 MyConnectionオブジェクトは同時に呼び出すことができます。 – acvcu

答えて

0

は言う:

WebClientのインスタンスはスレッドセーフではありません。単一のスレッドから を使用することを意図しています。

各スレッドには独自のWebClientが必要です。

+0

私はすでにドキュメントからこれを知っています。私は、WebClientの呼び出しから取得されたオブジェクトについて尋ねています。 webClient.getPage()メソッドを呼び出すことからHtmlPageを取り戻すと、HtmlPageスレッドは安全ですか、またはHtmlPageオブジェクトを扱うメソッドも同期する必要がありますか? – acvcu

+0

WebClientを取得するために使用されたWebClientにページがリンクされていると仮定すると、WebClientが属するスレッドと同じスレッドを1つのスレッドからも使用します。 –

+0

WebClientに何らかの形でリンクされているオブジェクトは、HtmlTablesなどの同期メソッド内にある必要があります。 – acvcu