Domanda

Ho un filtro Tomcat che delega le richieste a un oggetto di gestione in base all'URL.Questo è l'unico filtro in FilterChain.Ho un'app Ajax che martella questo filtro con molte richieste.

Recentemente ho notato un problema a causa del quale il filtro doFilter Il metodo viene spesso chiamato con una risposta impegnata come parametro (internamente, è la risposta del coyote ad essere contrassegnata come impegnata).

Mi sembra che l'unico modo in cui ciò possa accadere è se il recycle() il metodo non viene chiamato su questa risposta del coyote.Ho controllato per assicurarmi di non conservare riferimenti a nessuno degli oggetti request, risposta, outputStream o writer.Inoltre, mi sono assicurato di chiudere outputStream in un blocco final.Tuttavia, ciò non risolve il problema.

Sembra che io stia facendo qualcosa per abusare del contenitore servlet, ma ho difficoltà a rintracciarlo.

È stato utile?

Soluzione

Ho provato a utilizzare Tomcat 6.16 e 6.18.Questo è sicuramente l'unico filtro della catena.

Sembra che qualcosa mantenga un riferimento al servlet outputStream.Ho avvolto ServletOutputStream nel mio OutputStream e poi mi sono assicurato che il riferimento fosse distrutto.Ciò ha risolto il problema in modo che non venga più trasmessa una risposta impegnata.

Questo è uno strano effetto collaterale del mantenere un riferimento.Ma non penso che si qualifichi come un bug di Tomcat.Più probabilmente un bug in ImageIO.createImageOutputStream() che sospetto contenga il riferimento.

Altri suggerimenti

Che versione di Tomcat stai utilizzando?A me sembra un bug in Tomcat, non riesco a pensare a nessun motivo per cui il tuo metodo doFilter dovrebbe essere chiamato con una risposta che è già stata impegnata (se quel filtro è l'unico nella catena, ne sei sicuro? ).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top