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-tp28178639p28219133.html
Sent from the Camel - Users mailing list archive at Nabble.com.