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として
それぞれ同じWebClientインスタンスを使用する複数のスレッドを使用していますか? –
それではなぜ 'synchronized'が役に立つのでしょうか? 'synchronized'は、複数のスレッドが同じコードブロックを並列に実行するのを防ぐために使用されます。あなたは1つのスレッドしか持っていません。 –
私の間違い。それはウェブアプリケーションなので、マルチスレッドになります。 MyConnectionオブジェクトは同時に呼び出すことができます。 – acvcu