2009-11-03 4 views
4

J'ai un filtre de servlet qui génère des erreurs "Longueur de contenu déclaré dépassée" dans WebLogic 10.0. J'apprécierais toutes les suggestions pour résoudre ce problème s'il vous plaît. Détails comme suit.WebLogic "Dépassement de la longueur du contenu indiqué" Erreur

Le filtre de servlet redimensionne les images. Cette erreur se produit alors écrire le contenu d'un FileInputStream (à partir du disque) à response.getOutputStream():

java.net.ProtocolException: longueur du contenu Dépassé déclaré de 2228 à weblogic.servlet.internal.ChunkOutput.writeStream (ChunkOutput.java:411)

Voir la fin de ce message pour la trace de pile complète.

Notre environnement est WebLogic 10.0 avec Java 1.5 (sous Windows XP). Cependant, nous utilisons ce même filtre de servlet sur Tomcat 6, Java 1.6 depuis plus d'un an donc sans aucun problème. De plus, nous avons testé avec succès une version précédente de ce filtre de servlet avec WebLogic 8.1.

Les longueurs de contenu indiquées dans les erreurs de trace de pile correspondent exactement aux tailles des fichiers source sur le disque. Donc, je ne sais pas comment la longueur du contenu devient trop grande.

Les erreurs se produisent après le chargement de 6 images d'environ 2 Ko chacune. Donc, je me suis demandé si le problème pouvait être lié à la taille de la mémoire tampon de réponse de WebLogic, qui est d'environ 12 Ko.

J'ai tenté d'augmenter la taille du tampon de réponse à l'aide de la méthode response.setBufferSize(). Toutefois, WebLogic n'acceptera pas cette commande car la réponse a déjà été lancée. Est-ce que quelqu'un connaît un moyen de configurer la taille du tampon de réponse par défaut dans WebLogic?

Voici une version simplifiée du code. J'ai essayé d'ajouter out.flush(), mais en vain. Est-ce qu'il manque quelque chose qui causerait un problème avec WebLogic mais pas avec Tomcat?

// ----

File file = new File(mFileName); 
int fileLength = file.length(); 
response.setContentLength(fileLength); 
response.setContentType(contentType); 

OutputStream out = response.getOutputStream(); 

FileInputStream in = new FileInputStream(mFileName); 

byte[] buf = new byte[1024]; 
int count = 0; 

while ((count = in.read(buf)) >= 0) { 

    out.write(buf, 0, count); 
} 

in.close(); 

out.close(); 

// ----

Merci.

Cordialement

Brett S

La trace complète de la pile est:

####<3/11/2009 09:52:20 AM EST> <Error> <HTTP> <nmi02> <cgServer> <[ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1257202340094> <BEA-101019> <[[email protected] - appName: '_workshop_auto_generated_ear_', name: '/', context-path: ''] Servlet failed with IOException 
java.net.ProtocolException: Exceeded stated content length of 2228 
at weblogic.servlet.internal.ChunkOutput.writeStream(ChunkOutput.java:411) 
at weblogic.servlet.internal.ChunkOutputWrapper.writeStream(ChunkOutputWrapper.java:168) 
at weblogic.servlet.internal.ServletOutputStreamImpl.writeStream(ServletOutputStreamImpl.java:498) 
at weblogic.servlet.internal.ServletOutputStreamImpl.writeStream(ServletOutputStreamImpl.java:486) 
at weblogic.servlet.FileServlet.sendFile(FileServlet.java:407) 
at weblogic.servlet.FileServlet.doGetHeadPost(FileServlet.java:231) 
at weblogic.servlet.FileServlet.service(FileServlet.java:170) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) 
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:226) 
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:124) 
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:283) 
at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26) 
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42) 
at com.nminnovation.nmf.images.ConverterFilter.doFilter(ConverterFilter.java:98) 
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42) 
at com.nminnovation.nmf.util.CacheControlFilter.doFilter(CacheControlFilter.java:50) 
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42) 
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3368) 
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321) 
at weblogic.security.service.SecurityManager.runAs(Lweblogic.security.acl.internal.AuthenticatedSubject;Lweblogic.security.acl.internal.AuthenticatedSubject;Ljava.security.PrivilegedAction;)Ljava.lang.Object;(Unknown Source) 
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2117) 
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2023) 
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1359) 
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:200) 
at weblogic.work.ExecuteThread.run(ExecuteThread.java:172) 

Répondre

2

Une recherche Google pour

weblogic "Exceeded stated content length" 

se présente un certain nombre de coups, le plus intéressant qui est here. En résumé, essayez response.resetBuffer() après avoir défini la longueur du contenu.

4

Merci pour votre réponse Jim.

La solution était de supprimer response.setContentLength() puis ajouter response.flushBuffer()

File file = new File(mFileName); 
int fileLength = file.length(); 
//removed this line: 
//response.setContentLength(fileLength); 
response.setContentType(contentType); 

OutputStream out = response.getOutputStream(); 

FileInputStream in = new FileInputStream(mFileName);    
byte[] buf = new byte[ fileLength ]; 
int count = 0; 
while ((count = in.read(buf)) >= 0) { 
    out.write(buf, 0, count); 
} 
in.close(); 
out.close(); 
//and added this line: 
response.flushBuffer(); 

Merci encore.

Cordialement Brett S

Questions connexes