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
>>
>
>

Reply via email to