Hello Willem, Creating a patch shouldn't be a problem, BUT the reason I didn't create a patch is because I'm not 100% Sure my solution doesn't break any existing stuff.
Can you review my proposed temp file deletion change, is it likely it won't break any existing stuff ? willem.jiang wrote: > > Hi Raymond, > > Thank you for sharing this with the camel community. > Can you submit a patch against the latest trunk into the JIRA with a > test case? > I'd be happy to apply your patch into the trunk :) > > > Willem > > rdomingo wrote: >> Created issue for this, see issue 2636: >> https://issues.apache.org/activemq/browse/CAMEL-2636 >> >> I fixed this by (checking out apache camel-core and camel-http 2.2.0): >> In FileInputStreamCache.java: >> In method close() wrapped getInputStream().close() in if: >> if (stream != null && stream instanceof FileInputStream && >> ((FileInputStream) stream).getChannel().isOpen()) { >> getInputStream().close() >> ; } >> >> In method reset() also: >> if (stream != null && stream instanceof FileInputStream && >> ((FileInputStream) stream).getChannel().isOpen()) { >> getInputStream().close() >> ; } >> } >> >> Second I needed to fix a filenotfoundexception, the tempfile created by >> camel was deleted to early. >> I changed CachedOutputStream.java >> >> * Reimplemented constructor: >> public CachedOutputStream(Exchange exchange) { >> String hold = exchange.getContext().getProperties().get(THRESHOLD); >> String dir = exchange.getContext().getProperties().get(TEMP_DIR); >> if (hold != null) { this.threshold = >> exchange.getContext().getTypeConverter().convertTo(Long.class, hold); } >> if (dir != null) { this.outputDir = >> exchange.getContext().getTypeConverter().convertTo(File.class, dir); } >> >> // add on completion so we can cleanup after the exchange is done such >> // as deleting temporary files >> exchange.addOnCompletion(new SynchronizationAdapter() { >> @Override >> public void onDone(Exchange exchange) { >> try { >> // close the stream and FileInputStreamCache >> // close(); >> // for (FileInputStreamCache cache : fileInputStreamCaches) >> // { // cache.close(); // } >> // cleanup temporary file >> if (tempFile != null) { >> System.err.println("####################################################"); >> System.err.println("DISABLED tempFile.delete:89"); >> System.err.println("####################################################"); >> // boolean deleted = tempFile.delete(); >> // if (!deleted) { // LOG.warn("Cannot delete temporary cache file: " + >> // >> tempFile); // } else if (LOG.isTraceEnabled()) { // LOG.trace("Deleted >> temporary cache file: " + // tempFile); // } >> tempFile = null; >> } >> } catch (Exception e) { LOG.warn("Error deleting temporary cache file: " >> + >> tempFile, e); } >> } >> >> @Override >> public String toString() { return "OnCompletion[CachedOutputStream]"; } >> }); >> } >> >> Reimplemented close(): >> public void close() throws IOException { >> System.err.println("####################################################"); >> System.err.println("outputStream.close:119 -> delete tempFile"); >> System.err.println("####################################################"); >> new Exception().printStackTrace(); >> currentStream.close(); >> boolean deleted = tempFile.delete(); >> if (!deleted) { LOG.warn("Cannot delete temporary cache file: " + >> tempFile); >> } else if (LOG.isTraceEnabled()) { LOG.trace("Deleted temporary cache >> file: >> " + tempFile); } >> } >> >> >> rdomingo wrote: >>> Damn, It seems I'm running in to a Java Bug :( >>> >>> http://256.com/gray/docs/misc/java_bad_file_descriptor_close_bug.shtml >>> >>> >>> >>> rdomingo wrote: >>>> Hello, >>>> >>>> 1 - I have a http service setup (using camel) >>>> <route> >>>> <from uri="jetty:http://0.0.0.0:9101/clipboard/download" /> >>>> <to uri="bean:clipboardBean?method=download" async="false" >>>> /> >>>> </route> >>>> >>>> 2 - When I download a (txt or binary) file directly from this http >>>> service, download is ok. >>>> >>>> 3 - When I add a http bridge between the service and downloader BINARY >>>> files can't be downloaded -> 0KB, text files still download ok. >>>> <route> >>>> <from >>>> uri="jetty:http://0.0.0.0:8201/clipboard?matchOnUriPrefix=true" /> >>>> <to uri="http://0.0.0.0:9101?bridgeEndpoint=true" /> >>>> </route> >>>> >>>> How can I enable bridging of binary file downloads over HTTP ??? >>>> >>>> In my logging I see an Exception: >>>> java.io.IOException: Bad file descriptor >>>> at java.io.FileInputStream.available(Native Method) >>>> at >>>> org.apache.camel.converter.stream.FileInputStreamCache.available(FileInputStreamCache.java:70) >>>> at org.apache.camel.util.IOHelper.copy(IOHelper.java:85) >>>> at org.apache.camel.util.IOHelper.copy(IOHelper.java:81) >>>> at >>>> org.apache.camel.component.http.DefaultHttpBinding.doWriteDirectResponse(DefaultHttpBinding.java:183) >>>> at >>>> org.apache.camel.component.http.DefaultHttpBinding.doWriteResponse(DefaultHttpBinding.java:169) >>>> at >>>> org.apache.camel.component.http.DefaultHttpBinding.writeResponse(DefaultHttpBinding.java:116) >>>> at >>>> org.apache.camel.component.http.CamelServlet.service(CamelServlet.java:61) >>>> at javax.servlet.http.HttpServlet.service(HttpServlet.java:690) >>>> at >>>> org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) >>>> at >>>> org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:390) >>>> at >>>> org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) >>>> at >>>> org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230) >>>> at >>>> org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) >>>> at org.mortbay.jetty.Server.handle(Server.java:326) >>>> at >>>> org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) >>>> at >>>> org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923) >>>> at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:547) >>>> at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212) >>>> at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) >>>> at >>>> org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409) >>>> at >>>> org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582) >>>> 2010-04-08 15:37:45.911:WARN::/clipboard/download: java.io.IOException: >>>> Bad file descriptor >>>> >>>> >>>> Best regards, >>>> Raymond Domingo >>>> >>> >> > > > -- View this message in context: http://old.nabble.com/bridging-binary-files-over-http-tp28178639p28227081.html Sent from the Camel - Users mailing list archive at Nabble.com.