Hi Jakob, thank you for your answer. I agree to your explanation. Although I believe Jetty does work as expected. It allows concurrent exceptions, the only thing it is missing is the fact that it returns input streams also when they are closed. I would assume that it would be more suitable if jetty would check if the connection is still open, otherwise open a new one and return that.
Nevertheless, as stated previously I have tried out the Jetty patch. What wonders me the most is that the stream still gets closed (probably by xerces). This shouldn't be possible anymore, since in this solution the close method has been overridden in order to do nothing. So regardless of who is trying to close it, it simply should not get closed! By now I have another clue what it might could be. Since the patch does not allow closing the input stream, this input stream which is closed might not even pass this lines of code. Maybe those resources come from some other place. After some research I came across the following statement: "There are two places that the application can deliver an input source to the parser: as the argument to the Parser.parse method, or as the return value of the *EntityResolver.resolveEntity* method." -- http://download.oracle.com/javase/6/docs/api/org/xml/sax/InputSource.html I am wondering if xerces gets the resource from EntityResolver.resolveEntity. This would explain a lot. So far I have found 3 implementations: * org.apache.xerces.util.DOMEntityResolverWrapper * org.apache.xerces.util.EntityResolverWrapper * org.apache.xerces.util.EntityResolver2Wrapper I am not sure yet which of those is involved here. Any comments, ideas, statements to this? Thanks. Gregor JARISCH Basis und Spezialdienste Raiffeisen Bausparkasse Gesellschaft m.b.H. 1050 Wien, Wiedner Hauptstraße 94 Tel.: +43 (1) 546 46-1619, Fax: DW 2360 E-Mail: [email protected] www.bausparen.at FN 116309v, Handelsgericht Wien ------------------------------------------------- Jetzt Jugend Bausparen und Bausparbox holen! Alle Infos auf www.bausparen.at Von: Jakob Korherr <[email protected]> An: MyFaces Development <[email protected]> Datum: 26.10.2011 12:59 Betreff: Re: java.lang.IllegalStateException: zip file closed Gesendet von: [email protected] Hi Gregor, This issue seems to be a race condition resulting of the combination of xerces closing every InputStream it gets and Jetty failing to handle this. In the stacktrace you can see that there is a call to ServletContext.getResource() via ExternalContext. Also you can see that it currently tries to load an xhtml file of a composite component. IMO the problem is the following: the 1st thread runs through the above stacktrace, Jetty opens the jar file in which the xhtml file is located and returns the URL. Then the second thread does the same. At the same time the 2nd thread does this, the first thread processes the xhtml file by getting the InputStream and handing it over to xerxes for parsing it (in order to create the component tree for the composite component). Unfortunately, xerxes closes this InputStream when it is done. However, the 2nd thread is still reading the same jar file (internally via the same JarInputStream), which unfortunately has been closed. Thus the exception from the JDK class. I think that this is a result of poor concurrent jar file handling of jetty. I don't know what the servlet spec states here exactly, but I am pretty sure that multiple concurrent connections to the same jar file should be possible. Regards, Jakob 2011/10/25 Michael Kurz <[email protected]>: > Hi, > have you already tried it on another servlet container like tomcat? > I guess the key for finding out what happens is the other thread that does > not fail. The first thing I would try to find out is where the > JarFileResource (or the underlying file) is closed. > Have you checked that the resource in question is really loaded with the > code that was changed with the Jetty patch? > regards > Michael > > Am 25.10.2011 um 14:47 schrieb [email protected]: > > Hello, > > we are developing internal software based on myfaces (2.0.2) and jetty > (7.1.6). We ran into the following problem: > After the start of the server, if two requests (threads) are send at the > same time, jetty reports an "IllegalStateException: zip file closed". > To me it seems that one request is closing the stream when it has finished > using it, so for the second request it has already been closed when it trys > to attempt using it. > > After some research we had a very promising solution suggestion: > http://jira.codehaus.org/browse/JETTY-254 > http://jira.codehaus.org/secure/attachment/26212/JETTY-254-2.patch > > We did patch it, but the behaviour did not change at all. It also doesn't > work with the current jetty (in which the patch is also included). > > Following is our stacetrace; It is very similar to the problem described in > the jira issue above. Still, it seems to be something else. > I am glad for any suggestions. > > Thanks in advance. > > java.lang.IllegalStateException: zip file closed > at java.util.zip.ZipFile.ensureOpen(ZipFile.java:403) ~[na:1.6.0_17] > at java.util.zip.ZipFile.access$100(ZipFile.java:29) ~[na:1.6.0_17] > at java.util.zip.ZipFile$2.nextElement(ZipFile.java:309) > ~[na:1.6.0_17] > at java.util.zip.ZipFile$2.nextElement(ZipFile.java:299) > ~[na:1.6.0_17] > at java.util.jar.JarFile$1.nextElement(JarFile.java:223) > ~[na:1.6.0_17] > at java.util.jar.JarFile$1.nextElement(JarFile.java:218) > ~[na:1.6.0_17] > at > org.eclipse.jetty.util.resource.JarFileResource.exists(JarFileResource.java:163) > ~[org.eclipse.jetty.util_7.1.6.v20100715.jar:7.1.6.v20100715] > at > org.eclipse.jetty.webapp.WebAppContext.getResource(WebAppContext.java:290) > ~[org.eclipse.jetty.webapp_7.1.6.v20100715.jar:7.1.6.v20100715] > at > org.eclipse.jetty.webapp.WebAppContext$Context.getResource(WebAppContext.java:1003) > ~[org.eclipse.jetty.webapp_7.1.6.v20100715.jar:7.1.6.v20100715] > at > org.apache.myfaces.context.servlet.ServletExternalContextImplBase.getResource(ServletExternalContextImplBase.java:121) > ~[myfaces-impl-2.0.2.jar:2.0.2] > at > org.apache.myfaces.shared_impl.resource.ExternalContextResourceLoader.getResourceURL(ExternalContextResourceLoader.java:144) > ~[myfaces-impl-2.0.2.jar:2.0.2] > at > org.apache.myfaces.application.ResourceHandlerImpl.deriveResourceMeta(ResourceHandlerImpl.java:228) > ~[myfaces-impl-2.0.2.jar:2.0.2] > at > org.apache.myfaces.application.ResourceHandlerImpl.createResource(ResourceHandlerImpl.java:104) > ~[myfaces-impl-2.0.2.jar:2.0.2] > at > javax.faces.application.ResourceHandlerWrapper.createResource(ResourceHandlerWrapper.java:50) > ~[myfaces-api-2.0.2.jar:2.0.2] > at > org.apache.myfaces.custom.captcha.CAPTCHAResourceHandlerWrapper.createResource(CAPTCHAResourceHandlerWrapper.java:82) > ~[tomahawk20-1.1.10.jar:1.1.10] > at > org.apache.myfaces.tomahawk.resource.UncompressedResourceHandlerWrapper.createResource(UncompressedResourceHandlerWrapper.java:107) > ~[tomahawk20-1.1.10.jar:1.1.10] > at > javax.faces.application.ResourceHandlerWrapper.createResource(ResourceHandlerWrapper.java:50) > ~[myfaces-api-2.0.2.jar:2.0.2] > at > org.apache.myfaces.custom.captcha.CAPTCHAResourceHandlerWrapper.createResource(CAPTCHAResourceHandlerWrapper.java:82) > ~[tomahawk20-1.1.10.jar:1.1.10] > at > org.apache.myfaces.tomahawk.resource.UncompressedResourceHandlerWrapper.createResource(UncompressedResourceHandlerWrapper.java:107) > ~[tomahawk20-1.1.10.jar:1.1.10] > at > org.apache.myfaces.tomahawk.resource.UncompressedResourceHandlerWrapper.createResource(UncompressedResourceHandlerWrapper.java:61) > ~[tomahawk20-1.1.10.jar:1.1.10] > at > org.apache.myfaces.view.facelets.compiler.TagLibraryConfig$TagLibraryImpl.containsTagHandler(TagLibraryConfig.java:97) > ~[myfaces-impl-2.0.2.jar:2.0.2] > at > org.apache.myfaces.view.facelets.tag.CompositeTagLibrary.containsTagHandler(CompositeTagLibrary.java:73) > ~[myfaces-impl-2.0.2.jar:2.0.2] > at > org.apache.myfaces.view.facelets.compiler.CompilationManager.pushTag(CompilationManager.java:270) > ~[myfaces-impl-2.0.2.jar:2.0.2] > at > org.apache.myfaces.view.facelets.compiler.SAXCompiler$CompilationHandler.startElement(SAXCompiler.java:227) > ~[myfaces-impl-2.0.2.jar:2.0.2] > at org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown > Source) ~[xercesImpl-2.9.0.jar:na] > at org.apache.xerces.impl.dtd.XMLDTDValidator.startElement(Unknown > Source) ~[xercesImpl-2.9.0.jar:na] > at > org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown > Source) ~[xercesImpl-2.9.0.jar:na] > at > org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown > Source) ~[xercesImpl-2.9.0.jar:na] > at > org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown > Source) ~[xercesImpl-2.9.0.jar:na] > at org.apache.xerces.parsers.XML11Configuration.parse(Unknown > Source) ~[xercesImpl-2.9.0.jar:na] > at org.apache.xerces.parsers.XML11Configuration.parse(Unknown > Source) ~[xercesImpl-2.9.0.jar:na] > at org.apache.xerces.parsers.XMLParser.parse(Unknown Source) > ~[xercesImpl-2.9.0.jar:na] > at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source) > ~[xercesImpl-2.9.0.jar:na] > at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown > Source) ~[xercesImpl-2.9.0.jar:na] > at org.apache.xerces.jaxp.SAXParserImpl.parse(Unknown Source) > ~[xercesImpl-2.9.0.jar:na] > at javax.xml.parsers.SAXParser.parse(SAXParser.java:198) > ~[na:1.6.0_17] > at > org.apache.myfaces.view.facelets.compiler.SAXCompiler.doCompile(SAXCompiler.java:675) > ~[myfaces-impl-2.0.2.jar:2.0.2] > at > org.apache.myfaces.view.facelets.compiler.Compiler.compile(Compiler.java:118) > ~[myfaces-impl-2.0.2.jar:2.0.2] > at > org.apache.myfaces.view.facelets.impl.DefaultFaceletFactory._createFacelet(DefaultFaceletFactory.java:280) > ~[myfaces-impl-2.0.2.jar:2.0.2] > at > org.apache.myfaces.view.facelets.impl.DefaultFaceletFactory.getFacelet(DefaultFaceletFactory.java:162) > ~[myfaces-impl-2.0.2.jar:2.0.2] > at > org.apache.myfaces.view.facelets.impl.DefaultFaceletFactory.getFacelet(DefaultFaceletFactory.java:137) > ~[myfaces-impl-2.0.2.jar:2.0.2] > at > org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage._getFacelet(FaceletViewDeclarationLanguage.java:1888) > ~[myfaces-impl-2.0.2.jar:2.0.2] > at > org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.buildView(FaceletViewDeclarationLanguage.java:311) > ~[myfaces-impl-2.0.2.jar:2.0.2] > at > org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:66) > ~[myfaces-impl-2.0.2.jar:2.0.2] > at > org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:239) > ~[myfaces-impl-2.0.2.jar:2.0.2] > at javax.faces.webapp.FacesServlet.service(FacesServlet.java:191) > ~[myfaces-api-2.0.2.jar:2.0.2] > at > org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:527) > ~[org.eclipse.jetty.servlet_7.1.6.v20100715.jar:7.1.6.v20100715] > at > org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1216) > ~[org.eclipse.jetty.servlet_7.1.6.v20100715.jar:7.1.6.v20100715] > at > org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:286) > ~[tomahawk20-1.1.10.jar:1.1.10] > at > org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1187) > ~[org.eclipse.jetty.servlet_7.1.6.v20100715.jar:7.1.6.v20100715] > at > org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:349) > ~[tomahawk20-1.1.10.jar:1.1.10] > at > org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1187) > ~[org.eclipse.jetty.servlet_7.1.6.v20100715.jar:7.1.6.v20100715] > at > org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:421) > [org.eclipse.jetty.servlet_7.1.6.v20100715.jar:7.1.6.v20100715] > at > org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119) > [org.eclipse.jetty.server_7.1.6.v20100715.jar:7.1.6.v20100715] > at > org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:456) > [org.eclipse.jetty.security_7.1.6.v20100715.jar:7.1.6.v20100715] > at > org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:225) > [org.eclipse.jetty.server_7.1.6.v20100715.jar:7.1.6.v20100715] > at > org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:930) > [org.eclipse.jetty.server_7.1.6.v20100715.jar:7.1.6.v20100715] > at > org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:358) > [org.eclipse.jetty.servlet_7.1.6.v20100715.jar:7.1.6.v20100715] > at > org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:183) > [org.eclipse.jetty.server_7.1.6.v20100715.jar:7.1.6.v20100715] > at > org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:866) > [org.eclipse.jetty.server_7.1.6.v20100715.jar:7.1.6.v20100715] > at > org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117) > [org.eclipse.jetty.server_7.1.6.v20100715.jar:7.1.6.v20100715] > at > org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:245) > [org.eclipse.jetty.server_7.1.6.v20100715.jar:7.1.6.v20100715] > at > org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:126) > [org.eclipse.jetty.server_7.1.6.v20100715.jar:7.1.6.v20100715] > at > org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:113) > [org.eclipse.jetty.server_7.1.6.v20100715.jar:7.1.6.v20100715] > at org.eclipse.jetty.server.Server.handle(Server.java:351) > [org.eclipse.jetty.server_7.1.6.v20100715.jar:7.1.6.v20100715] > at > org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:594) > [org.eclipse.jetty.server_7.1.6.v20100715.jar:7.1.6.v20100715] > at > org.eclipse.jetty.server.HttpConnection$RequestHandler.content(HttpConnection.java:1059) > [org.eclipse.jetty.server_7.1.6.v20100715.jar:7.1.6.v20100715] > at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:764) > [org.eclipse.jetty.http_7.1.6.v20100715.jar:7.1.6.v20100715] > at > org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:217) > [org.eclipse.jetty.http_7.1.6.v20100715.jar:7.1.6.v20100715] > at > org.eclipse.jetty.server.HttpConnection.handle(HttpConnection.java:424) > [org.eclipse.jetty.server_7.1.6.v20100715.jar:7.1.6.v20100715] > at > org.eclipse.jetty.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:506) > [org.eclipse.jetty.io_7.1.6.v20100715.jar:7.1.6.v20100715] > at > org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:436) > [org.eclipse.jetty.util_7.1.6.v20100715.jar:7.1.6.v20100715] > at java.lang.Thread.run(Thread.java:619) [na:1.6.0_17] > > Gregor JARISCH > Basis und Spezialdienste > > Raiffeisen Bausparkasse Gesellschaft m.b.H. > 1050 Wien, Wiedner Hauptstraße 94 > Tel.: +43 (1) 546 46-1619, Fax: DW 2360 > E-Mail: [email protected] > www.bausparen.at > FN 116309v, Handelsgericht Wien > > ------------------------------------------------- > > Zuverlässigkeit seit 50 Jahren - Raiffeisen Bausparen > Alle Infos auf https://www.bausparen.at/ > > <mime-attachment.jpg> > > ______________________________________ > Raiffeisen Bausparkasse Gesellschaft m.b.H., 1050 Wien, Wiedner Hauptstraße > 94, Firmenbuchnummer 116309v, Handelsgericht Wien, DVR 0066257, UID > ATU15350206 > > Diese E-Mail kann vertrauliche und geschuetzte Informationen enthalten. Wenn > diese E-Mail nicht für Sie bestimmt ist, bitten wir Sie, uns unverzueglich > zu informieren und sie zu loeschen. > > This e-mail message may contain information, which is confidential and > protected. If you are not the intended recipient of this message, we ask you > to inform us immediately and delete the message afterwards. > > -- Jakob Korherr blog: http://www.jakobk.com twitter: http://twitter.com/jakobkorherr work: http://www.irian.at ______________________________________ Raiffeisen Bausparkasse Gesellschaft m.b.H., 1050 Wien, Wiedner Hauptstraße 94, Firmenbuchnummer 116309v, Handelsgericht Wien, DVR 0066257, UID ATU15350206 Diese E-Mail kann vertrauliche und geschuetzte Informationen enthalten. Wenn diese E-Mail nicht für Sie bestimmt ist, bitten wir Sie, uns unverzueglich zu informieren und sie zu loeschen. This e-mail message may contain information, which is confidential and protected. If you are not the intended recipient of this message, we ask you to inform us immediately and delete the message afterwards.
