Frage

Ich habe einen Tomcat-Filter, der Anfragen abhängig von der URL an ein Verarbeitungsobjekt delegiert.Dies ist der einzige Filter im FilterChain.Ich habe eine Ajax-App, die diesen Filter mit vielen Anfragen bombardiert.

Kürzlich ist mir ein Problem mit dem Filter aufgefallen doFilter Die Methode wird häufig mit einer festgeschriebenen Antwort als Parameter aufgerufen (intern ist es die Coyote-Antwort, die als festgeschrieben markiert ist).

Es scheint mir, dass dies nur dann passieren kann, wenn das recycle() Die Methode wird für diese Coyote-Antwort nicht aufgerufen.Ich habe überprüft, ob ich keine Verweise auf die Request-, Response-, OutputStream- oder Writer-Objekte behalte.Außerdem habe ich darauf geachtet, den OutputStream in einem „finally“-Block zu schließen.Dies löst dieses Problem jedoch nicht.

Das hört sich so an, als würde ich den Servlet-Container missbrauchen, aber es fällt mir schwer, ihn aufzuspüren.

War es hilfreich?

Lösung

Ich habe versucht, Tomcat 6.16 und 6.18 zu verwenden.Dies ist definitiv der einzige Filter in der Kette.

Es scheint, dass irgendetwas einen Verweis auf den Servlet-Ausgabestrom behält.Ich habe den ServletOutputStream in meinen eigenen OutputStream eingeschlossen und dann sichergestellt, dass die Referenz zerstört wird.Dadurch wurde das Problem behoben, sodass ich keine übergebene bestätigte Antwort mehr sehe.

Dies ist ein seltsamer Nebeneffekt beim Halten einer Referenz.Aber ich glaube nicht, dass es sich um einen Tomcat-Fehler handelt.Wahrscheinlicher ist ein Fehler in ImageIO.createImageOutputStream(), von dem ich vermute, dass er die Referenz enthält.

Andere Tipps

Welche Tomcat-Version verwenden Sie?Für mich klingt das nach einem Fehler in Tomcat. Ich kann mir keinen Grund vorstellen, warum Ihre doFilter-Methode mit einer Antwort aufgerufen werden sollte, die bereits festgeschrieben wurde (wenn dieser Filter der einzige in der Kette ist, sind Sie sich da sicher? ).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top