2 Stimmen

Servlet, der von Icefaces-Webanwendung aufgerufen wird, verursacht ständig hohe CPU-Auslastung beim Client

Ich entwickle eine Webanwendung (mit JBoss und Icefaces), die einen Servlet verwendet, um eine Excel- oder PDF-Datei zu erstellen und sie an den Browser zu senden.

Aber ich habe Leistungsprobleme, nachdem das Servlet aufgerufen wurde, was zu einem konstant hohen (~50%) CPU-Verbrauch des Browsers führt. Getestet in Firefox und Internet Explorer auf verschiedenen Maschinen. Die hohe CPU-Auslastung tritt mit etwas Verzögerung (eine halbe Minute) nach dem Aufruf des Servlets auf und bleibt hoch (bis ich den Browser schließe oder die Seite neu lade). Ob ich die erstellte Datei herunterlade oder direkt öffne, macht keinen Unterschied.

Ich bin ratlos, wie das passieren kann...

Gibt es eine Möglichkeit, den Browser zu analysieren/debuggen, um herauszufinden, was den CPU-Verbrauch verursacht?

UPDATE:

Ich habe herausgefunden, dass dies definitiv mit der Icefaces-Webanwendung zusammenhängt. Wenn ich meinen direkten HTML-Link zu meinem Servlet durch einen JavaScript-Aufruf ersetze, der das Servlet in einem neuen Fenster öffnet (mit window.open), kann ich die erstellte Datei ohne Probleme herunterladen.

Auch wenn ich mich innerhalb meiner Anwendung abmelde, geht die CPU-Auslastung wieder auf normalen Stand zurück!

UPDATE:

Jetzt hat mir Firebug geholfen: Nachdem das Servlet aufgerufen wurde, sehe ich in der Firebug-Konsole, dass es XMLHtppRequests jede Millisekunde gibt. Jetzt verstehe ich die CPU-Auslastung!

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

kommt immer wieder. Muss das überprüfen...

UPDATE: Ok, ich habe einen Icefaces-Thread gefunden (mit dem entsprechenden Icefaces-Jira-Bug), aber der Bugtracker besagt, dass dies bereits behoben sein sollte... irgendwie nicht für meinen Fall!

1voto

BalusC Punkte 1034465

Browser führen keine Servlets aus. Browser führen/zeigen die Ausgabe aus, die vom Servlet erzeugt wird. Es ist die Ausgabe, die eine hohe Last verursacht. Basierend auf den bisher gegebenen Informationen ist es schwer zu sagen, was das Problem mit der Ausgabe ist. Firebug kann viele Einblicke darüber geben, was im Webbrowser passiert.

Normalerweise kann eine außergewöhnlich große HTML-Tabelle oder ein ineffizientes Stück JavaScript-Code viele CPU-/Speicherressourcen verbrauchen. Aber bei einem binären Dateidownload wie XLS/PDF sollte dies tatsächlich nicht passieren. Die Ursache liegt wahrscheinlich tiefer. Sehen Sie eine hohe Ressourcennutzung, wenn Sie eine Datei-zu-Datei-Kopie auf der Festplatte durchführen? Wenn ja, könnte es wahrscheinlich an einer defekten Festplatte oder einem defekten Festplatten-Treiber oder daran liegen, dass die Festplatten-DMA deaktiviert ist.


Aktualisierung: Gemäß Ihren Untersuchungen mit Hilfe von Firebug scheint es, als ob Sie IceFaces' ice:commandButton oder ice:commandLink zum Herunterladen der Datei verwenden. Ersetzen Sie sie durch die normalen JSF h:commandButton oder h:commandLink, damit nicht unnötig JS-Code generiert wird, der dafür verantwortlich ist.

1voto

David O'Meara Punkte 2957

Hast du FindBugs oder andere Tools für statische Codeanalyse ausprobiert? http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis#Java

1voto

Bozho Punkte 570413

Wenn der CPU-Verbrauch wirklich vom Browser stammt, dann können Sie nichts dagegen tun - es handelt sich entweder um den PDF- oder Excel-Viewer.

Wenn der Server auf derselben Maschine läuft und die CPU-Last vom Servlet stammt, dann müssen Sie es optimieren. Geben Sie uns den Code dafür.

0voto

räph Punkte 3584

Problem gelöst (eigentlich handelt es sich mehr um einen Workaround).

Es handelt sich um ein Iceface-Problem, das gemäß dem Bugtracker behoben werden sollte. Da es jedoch tatsächlich immer noch vorhanden ist, konnte ich es nur beheben, indem ich das Servlet in einem neuen Fenster aufrief, das durch JavaScript erstellt wurde (wie bereits in meiner bearbeiteten Frage erwähnt). Es ist wirklich keine schöne Lösung und hat den Nachteil, dass der Browser keine Popups blockieren darf. Es ist jedoch auch eine Lösung, die ich bereits mehrmals im Netz gesehen habe (wie hier).

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X