By the way, the problem appears not on if there are two files. It appears if the last exchange is not passed to the endpoint.
Example with only one file : from("file://C:/Temp/camel/rep1/?noop=true") .split() .tokenize("\n") .streaming() .process(new Processor() { public void process(Exchange exchange) throws Exception { // After 2 lines, next lines are rejected via an // exchange property i++; if (i > 2) { exchange.setProperty("FILE_1", false); } else { exchange.setProperty("FILE_1", true); } } }) .choice() .when(property("FILE_1").isEqualTo(Boolean.TRUE)) .to("stream:file?fileName=C:/Temp/camel/rep1/out/out_1.csv&closeOnDone=true") .end() .end() .end(); Jeff 2013/5/16 Jean Francois LE BESCONT <jflebesc...@gmail.com> > Hi, > > Thanks Claus for the answer. I have logged a jira ( > https://issues.apache.org/jira/browse/CAMEL-6367) > > I have not really understand how to implements your recommandation about > exchange.addOnCompletion. After downloaded the camel code to understand > how package org.apache.camel.converter.stream works, I don't know how to > access the fileInputStreamCache from the processor : > > > .process(new Processor() { > > public void process(Exchange exchange) throws Exception { > exchange.addOnCompletion(new SynchronizationAdapter() { > @Override > public void onDone(Exchange exchange) { > FileInputStreamCache fileInputStreamCache= ?????????? ; > try { > if (fileInputStreamCache != null) { > fileInputStreamCache.close(); > } > close(); > } catch (Exception e) { > LOG.warn("Error deleting temporary cache file: " + tempFile, e); > } > } > }); > } > > Is it possible ? > > > Thanks > > Jeff > > > 2013/5/16 Claus Ibsen <claus.ib...@gmail.com> > >> I have updated the wiki docs. >> >> Though we could improve the stream component to auto close the stream >> when the exchange is done at the end of routing as a fallback. Then >> your use-case with writing to 2+ files can be supported, as all the >> streams is closed when the routing is done at the end. >> >> This requires to add an onCompletion to the exchange >> >> exchange.addOnCompletion >> >> And then add logic there to close the stream >> >> Though a little challenge could be concurrency if you close the >> stream, and then another exchange is using it currently. >> >> Seems like the logic in stream producer should sync (lock) and not per >> method which is wrong. >> Or maybe better yet do not have a shared output stream. >> >> Fell free to log a JIRA ticket >> >> >> >> >> >> On Thu, May 16, 2013 at 8:07 AM, Claus Ibsen <claus.ib...@gmail.com> >> wrote: >> > Hi >> > >> > That is because you do write to 2 files. The option was intended for >> > writing to the same file. >> > >> > >> > >> > >> > On Thu, May 16, 2013 at 7:43 AM, Jean Francois LE BESCONT >> > <jflebesc...@gmail.com> wrote: >> >> Hi, >> >> >> >> what should I do ? >> >> >> >> Thanks >> >> >> >> Jeff >> >> >> >> >> >> 2013/5/15 Jean Francois LE BESCONT <jflebesc...@gmail.com> >> >> >> >>> Hey ! >> >>> >> >>> A new option is available for the stream:file to close it when done >> >>> (closeOnDone). This option is appeared in 2.11 after my jira ( >> >>> https://issues.apache.org/jira/browse/CAMEL-6147) >> >>> >> >>> File unlock (or released or closed) looks to doesn't works fine if >> last >> >>> line is not passed to the endpoint >> >>> >> >>> Example : >> >>> >> >>> We have a CSV with X line. We want to write a part of it in a file >> >>> out_1.csv and a second part in a file out_2.csv according to a >> business >> >>> rule, in my example the rule is after two lines readed. >> >>> >> >>> An example is : >> >>> >> >>> from("file://C:/Temp/camel/rep1/?noop=true") >> >>> .log("start process file => ${file:name}") >> >>> .split() >> >>> .tokenize("\n") >> >>> .streaming() >> >>> .process(new Processor() { >> >>> >> >>> public void process(Exchange exchange) throws Exception { >> >>> // After 2 lines, next lines are rejected via an >> exchange >> >>> property >> >>> i++ ; >> >>> if( i > 2) { >> >>> exchange.setProperty("FILE_1", true ); >> >>> } else { >> >>> exchange.setProperty("FILE_1", false); >> >>> } >> >>> } >> >>> }) >> >>> .choice() >> >>> .when(property("FILE_1").isEqualTo(Boolean.TRUE)) >> >>> >> >>> >> >> .to("stream:file?fileName=C:/Temp/camel/rep1/out/out_1.csv&closeOnDone=true") >> >>> .when(property("FILE_2").isEqualTo(Boolean.TRUE)) >> >>> >> >>> >> .to("stream:file?fileName=C:/Temp/camel/rep1/out/out_2.csv&closeOnDone=true") >> >>> .end() >> >>> .end() >> >>> .log("end process file => ${file:name}") >> >>> .end() >> >>> ; >> >>> >> >>> It create two files, and out_1.csv is still locked. >> >>> >> >>> Should I update the jira or open a new ? >> >>> >> >>> Thanks >> >>> >> >>> Jeff >> >>> >> >>> >> > >> > >> > >> > -- >> > Claus Ibsen >> > ----------------- >> > www.camelone.org: The open source integration conference. >> > >> > Red Hat, Inc. >> > FuseSource is now part of Red Hat >> > Email: cib...@redhat.com >> > Web: http://fusesource.com >> > Twitter: davsclaus >> > Blog: http://davsclaus.com >> > Author of Camel in Action: http://www.manning.com/ibsen >> >> >> >> -- >> Claus Ibsen >> ----------------- >> www.camelone.org: The open source integration conference. >> >> Red Hat, Inc. >> FuseSource is now part of Red Hat >> Email: cib...@redhat.com >> Web: http://fusesource.com >> Twitter: davsclaus >> Blog: http://davsclaus.com >> Author of Camel in Action: http://www.manning.com/ibsen >> > >