Я работаю над проектом, который обращается к нескольким 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();
}
}