Вопросы по синхронизации HtmlUnit - PullRequest
0 голосов
/ 14 февраля 2012

Я использую HtmlUnit в одном из своих веб-проектов для скрининга кода.Мне интересно, в какой степени мне нужно синхронизировать код.В настоящее время я синхронизирую весь код, где я использую объект WebClient для извлечения страниц (т.е. webClient.getPage (url)).Я предполагаю, что если webClient.getPage () не синхронизирован, то «браузер» может попытаться загрузить несколько страниц одновременно (поправьте меня, если я ошибаюсь).Чтобы обойти это, мне, вероятно, придется открыть несколько окон, правильно?

Мой вопрос касается классов HtmlPage, HtmlTable и т. Д.После получения объекта HtmlPage нужно ли синхронизировать чтение этой страницы и других объектов, возвращаемых из объекта HtmlPage (т. Е. HtmlTable), или вся страница кэшируется в памяти?Я предполагаю, что если он не кэшируется, то, если WebClient снова вызывает getPage (), пока я манипулирую ранее возвращенным объектом HtmlPage, могут произойти плохие вещи.

Я хотел бы иметь класс 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 голосов
/ 14 февраля 2012

Как в javadoc говорится:

экземпляр WebClient не является поточно-ориентированным.Он предназначен для использования из одного потока.

Каждый поток должен иметь свой собственный WebClient.

...