camel-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Raymond Domingo (JIRA)" <j...@apache.org>
Subject [jira] Commented: (CAMEL-2636) IOException: Bad file descriptor and FileNotFoundException
Date Tue, 20 Apr 2010 09:56:25 GMT

    [ https://issues.apache.org/activemq/browse/CAMEL-2636?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=58969#action_58969
] 

Raymond Domingo commented on CAMEL-2636:
----------------------------------------

I couldn't verify it using 2.3.0 BETA... when using this version my camel 'bus connector'
didn't seem to work anymore....
Should it already be stable ?? (I don't really have time to look in to details right now)

I copied your new files to 2.2.0 (I checked out from svn) and rebuilded camel-core, files:
- CachedOutputStream.java
- FileInputStreamCache.java

And all is working correct now !

> IOException: Bad file descriptor and FileNotFoundException
> ----------------------------------------------------------
>
>                 Key: CAMEL-2636
>                 URL: https://issues.apache.org/activemq/browse/CAMEL-2636
>             Project: Apache Camel
>          Issue Type: Bug
>          Components: camel-core
>    Affects Versions: 2.2.0
>         Environment: Related to topic, I will post possible solution to this problem:
> http://old.nabble.com/bridging-binary-files-over-http-ts28178639.html
> Other useful links:
> http://256.com/gray/docs/misc/java_bad_file_descriptor_close_bug.shtml
> My environment:
> apache 2.2.0
> java version "1.6.0_19"
> Java(TM) SE Runtime Environment (build 1.6.0_19-b04)
> Java HotSpot(TM) 64-Bit Server VM (build 16.2-b04, mixed mode)
> no container, using:
> mvn camel:run
> 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)

> Config:
> <?xml version="1.0" encoding="UTF-8"?>
> <beans:beans xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>     xmlns="http://camel.apache.org/schema/spring" xmlns:cxf="http://camel.apache.org/schema/cxf"
>     xsi:schemaLocation="
>        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
>        http://camel.apache.org/schema/cxf http://camel.apache.org/schema/cxf/camel-cxf.xsd
>        http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
>     <camelContext id="camelContext" xmlns="http://camel.apache.org/schema/spring"
trace="true" autoStartup="true">
>         <!-- clipboard download producer -->
>         <route>
>             <from uri="jetty:http://0.0.0.0:8201/clipboard/download?chunked=true&amp;matchOnUriPrefix=true"
/>
>             <to uri="http://0.0.0.0:9101?bridgeEndpoint=true" async="false" />
>         </route>
>     </camelContext>
> </beans:beans>
>            Reporter: raymond domingo
>            Assignee: Willem Jiang
>             Fix For: 2.3.0
>
>   Original Estimate: 1 hour
>  Remaining Estimate: 1 hour
>
> When I try to stream BINARY (pdf) file using camel-http I get the java.io.IOException:
Bad file descriptor
> The pdf isn't recieved succesfully by reciever (0kb)
> This seems to be caused by a bug in java (on linux systems), closing inputstream twice
causes problems. It seemed to me this is exactly what is happening, see also link:
> http://256.com/gray/docs/misc/java_bad_file_descriptor_close_bug.shtml
> 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);
>         }
>     }

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message