Сервлет, вызываемый из веб-приложения Icefaces, создает постоянно высокую загрузку ЦП на клиенте.

Я разрабатываю веб-приложение (используя JBoss и Icefaces), которое использует сервлет для создания файла Excel или PDF и отправляет его в браузер.

Но у меня возникают проблемы с производительностью после вызова сервлета, что приводит к постоянно высокому (~ 50%) потреблению процессора браузером. Тестируйте в Firefox и Internet Explorer на разных машинах. Высокая загрузка процессора возникает с небольшой задержкой (полминуты) после вызова сервлета и остается высокой (пока я не закрою браузер или не перезагружу страницу). Загружу ли я созданный файл или открою его напрямую, не имеет значения.

Я без понятия, как это может произойти...

Есть ли способ проанализировать/отладить браузер, чтобы выяснить, что вызывает потребление процессора?

ОБНОВЛЕНИЕ:

Я узнал, что это определенно связано с веб-приложением Icefaces. Когда я заменяю свою прямую html-ссылку на свой сервлет вызовом javascript, который открывает сервлет в новом окне (с помощью window.open), я могу без проблем загрузить созданный файл.

Кроме того, когда я выхожу из своего приложения, использование ЦП снова возвращается к норме!

ОБНОВЛЕНИЕ:

Хорошо, теперь мне помог Firebug: после вызова сервлета я вижу в консоли Firebug, что каждые миллисекунды есть XMLHtppRequests. Теперь я могу понять загрузку процессора!

POST http://localhost/webapp/block/receive-updated-views

идет дальше и дальше. Надо это проверить...

ОБНОВЛЕНИЕ: Хорошо, я нашел тему Iceface (с соответствующей ошибкой jira iceface), но багтрекер утверждает, что это уже должно быть исправлено... как-то не для моего случая!


person räph    schedule 11.12.2010    source источник
comment
Проблема зависит только от документа Excel или PDF? То есть, если вы обслуживаете его с другого сервера без Java или сервлетов? Если да, то для этого вопроса не нужны теги [java] и [servlets].   -  person Roland Illig    schedule 11.12.2010
comment
Спасибо. Это определенно связано с веб-приложением, которое использует сервлеты и ледяные поверхности. У меня нет других проблем с загрузкой Excel или моим браузером.   -  person räph    schedule 11.12.2010


Ответы (4)


Пробовали ли вы FindBugs или другие инструменты для статического анализа кода? http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis#Java

person David O'Meara    schedule 11.12.2010

Если потребление процессора действительно идет от браузера, то с этим ничего не поделаешь — это либо просмотрщик PDF, либо excel.

Если сервер находится на той же машине, а нагрузка на процессор исходит от сервлета, то вам необходимо его оптимизировать. Дайте нам код для этого.

person Bozho    schedule 11.12.2010
comment
Спасибо. Потребление ЦП происходит в браузере, а не на сервере! И, поскольку это происходит также, когда я загружаю файл, я полагаю, что это не может быть надстройка для браузера или просмотрщик! - person räph; 11.12.2010

Браузеры не запускают сервлеты. Браузеры запускают/отображают вывод, созданный сервлетом. Это выход, который вызывает высокую нагрузку. Основываясь на малой информации, трудно сказать, в чем проблема с выходом. Firebug может дать много информации о том, что происходит в веб-браузере.

Обычно чрезвычайно большая HTML-таблица или неэффективный фрагмент кода JavaScript могут потреблять много ресурсов ЦП/памяти. Но при загрузке бинарного файла, такого как XLS/PDF, этого на самом деле не должно происходить. Тогда причина, вероятно, глубже. Видите ли вы много использования ресурсов при копировании файла в файл на жестком диске? Если это так, то это может быть плохой жесткий диск или плохой драйвер жесткого диска, или DMA жесткого диска отключен.


Обновление: согласно вашему расследованию с помощью Firebug, похоже, что вы используете ice:commandButton или ice:commandLink IceFaces для загрузки файла. Замените их на обычный JSF h:commandButton или h:commandLink, чтобы он без необходимости не генерировал JS-код, который за это отвечает.

person BalusC    schedule 11.12.2010
comment
Спасибо. Поскольку это двоичный файл, я действительно не понимаю, почему это происходит. И поскольку это происходит на разных машинах, это связано с веб-приложением, а не с жестким диском. - person räph; 11.12.2010
comment
Спасибо еще раз. На самом деле я использую не commandButton, а обычный html a href - person räph; 11.12.2010
comment
Хорошо, тогда это собственная странность IceFaces. Так как я не пользуюсь IceFaces, более развернутый ответ дать не могу. По крайней мере, мое предложение Firebug помогло вам определить основную причину :) - person BalusC; 11.12.2010

Проблема решена (на самом деле это скорее обходной путь).

Это проблема Iceface, которая должна быть исправлена ​​в соответствии с система отслеживания ошибок. Но поскольку на самом деле он все еще присутствует, я мог исправить это, только вызвав сервлет в новых окнах, созданных с помощью javascript. (Как уже упоминалось в моем отредактированном вопросе). Это действительно не очень хорошее решение, и у него есть недостаток: браузер не должен блокировать всплывающие окна. Но это также и решение, которое я несколько раз встречал в сети (например, здесь).

public void exportToExcel(ActionEvent e) {
   JavascriptContext.addJavascriptCall(FacesContext.getCurrentInstance(),  "window.open (\"downloadServlet.dl?contentType=excel\",\"report\")");
}
person räph    schedule 11.12.2010