Проблема с настройкой Javascript тайм-аут в htmlunit - PullRequest
1 голос
/ 17 февраля 2020

Я работаю над проектом, который обращается к нескольким URL-адресам и очищает свою страницу каждую минуту (завершено с использованием пула потоков). Я использую Htmlunit - 2,20 для этого. Однако функция тайм-аута не соответствует моим целям.

Во-первых, я использую WebClient.setTimeout (), который используется дважды, один раз для соединения с сокетом и снова для извлечения данных. Он создает новые сокет-соединения для извлечения каждого отдельного скрипта. js и, следовательно, лишает меня цели установить общее время ожидания для всего процесса соединения и выборки страницы. Во-вторых, я также использую webClient.setJavaScriptTimeout (), но это также устанавливает тайм-аут выполнения для каждого выполнения скрипта js, снова побеждая мою цель общего времени ожидания Javascript. Я также использовал webClient.waitForBackground JavaScript (), но он не останавливает выполнение Javascript даже после указанного времени ожидания.

Может ли кто-нибудь помочь мне с настройкой общего времени ожидания для выполнения Javascript , Я также попытался использовать интерфейс Future Java и установить тайм-аут для выборки страниц, но ограничением является то, что он создает дочерний поток для этого выполнения. Сам сервис работает в пуле потоков, а выборка каждого URL происходит в отдельном потоке. Если я создаю дочерний поток для каждого потока в пуле потоков, это увеличит потребление памяти. Любые мысли об этом или о том, как измерить увеличение потребления памяти, будут действительно полезны. Любая помощь приветствуется.

public String loadDocument(String url) {
        try {

            String content;

            webClient.setAjaxController(new NicelyResynchronizingAjaxController());
            request = new WebRequest(new URL(url));
            response = webClient.loadWebResponse(request);
            webClient.waitForBackgroundJavaScript(JS_TIMEOUT);
            webClient.setJavaScriptTimeout(JS_TIMEOUT);
            page = webClient.loadWebResponseInto(response, webClient.getCurrentWindow());
            Callable<Page> task = () -> {
                page = webClient.loadWebResponseInto(response, webClient.getCurrentWindow());
                return page;
             };
            future = executor.submit(task);
            log.info("Thread count after submitting task "+Thread.activeCount());
            page = future.get(JS_TIMEOUT, TimeUnit.SECONDS);
            if (page instanceof TextPage) {
                content = ((TextPage) page).getContent();
            }
            else {
                content = ((HtmlPage) page).asXml();
            }
            log.info("Successfully retrieved content");

            if (log.isTraceEnabled()) {
                log.trace("Response content:\n " + content);
            }
            return content;
        }
        catch (TimeoutException e)
        {
            log.info("Timed out");
            future.cancel(true);
            return response.getContentAsString();
        }
        catch (Exception e) {
            e.printStackTrace();
            System.out.println("Failed to retrieve content because of exception "+e.getCause());
            return null;
        }
        finally {
            log.info("Closing web client");
            log.info("Memory Used in kilo bytes"+ManagementFactory.getMemoryMXBean().getHeapMemoryUsage().getUsed()/1024);
            webClient.close();
            executor.shutdown();
        }
    }
...