HtmlUnit同步问题

时间:2012-02-14 13:50:34

标签: java synchronization htmlunit

我在我的一个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()是同步的。

1 个答案:

答案 0 :(得分:0)

正如the javadoc所说:

  

WebClient实例不是线程安全的。它旨在被使用   从一个线程。

每个线程都应该有自己的WebClient。