Сервлет, вызываемый из веб-приложения Icefaces, постоянно загружает процессор клиентом - PullRequest
2 голосов
/ 11 декабря 2010

Я занимаюсь разработкой веб-приложения (с использованием 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 thread (с соответствующей ошибкой iceface jira), но bugtracker заявляет, что это должно быть уже исправлено... как-то не для моего случая!

Ответы [ 4 ]

1 голос
/ 11 декабря 2010

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

1 голос
/ 11 декабря 2010

Если загрузка процессора действительно происходит из браузера, то вы ничего не можете с этим поделать - это либо программа просмотра PDF, либо Excel.

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

1 голос
/ 11 декабря 2010

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

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


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

0 голосов
/ 11 декабря 2010

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

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

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