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.

Reply via email to