我在我的一个Web项目中使用HtmlUnit来屏蔽一些代码。我想知道我需要在多大程度上同步代码。目前我正在同步我正在使用WebClient对象检索页面的所有代码(即webClient.getPage(url))。我假设如果webClient.getPage()没有同步,那么'浏览器'可能会尝试一次加载多个页面(如果我错了,请纠正我)。为了解决这个问题,我可能需要打开多个窗口,对吗?
我的问题是关于HtmlPage,HtmlTable等类。在检索HtmlPage对象后,是否需要同步该页面的读取和从HtmlPage对象(即HtmlTable)返回的其他对象,还是将整个页面缓存到内存中?我假设如果没有缓存,那么如果WebClient在我操作之前返回的HtmlPage对象时再次调用getPage(),则可能会发生错误。
我希望有一个Connection类,它具有控制WebClient调用的同步方法,这些方法将返回HtmlPage,然后操作页面而不必担心同步。这有什么问题吗?
示例:
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...
}
}
编辑:我知道WebClient不是线程安全的,因此我的示例中的MyConnection对象方法getHtmlPage()是同步的。