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

jeff commented on CAMEL-6367:
-----------------------------

Hi Willem, 

I hav found a solution, based on the idea of send the exchange to both endpoint 
: 

public void configure() throws Exception {

                // Properties
                final String PROP_WRITE_IN_FILE_1 = "PROP_WRITE_IN_FILE_1";
                final String PROP_WRITE_IN_FILE_2 = "PROP_WRITE_IN_FILE_2";
                
                // Routes 
                final String ROUTE_FILE_1 = "direct:ROUTE_FILE_1" ;
                final String ROUTE_FILE_2 = "direct:ROUTE_FILE_2" ;
                
                // MAIN ROUTE
                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(PROP_WRITE_IN_FILE_1, true);
                                                
exchange.setProperty(PROP_WRITE_IN_FILE_2, false);
                                        } else {
                                                
exchange.setProperty(PROP_WRITE_IN_FILE_1, false);
                                                
exchange.setProperty(PROP_WRITE_IN_FILE_2, true);
                                        }
                                }
                        })
                        .multicast().parallelProcessing()
                                .to(ROUTE_FILE_1  , ROUTE_FILE_2 )
                        .end()
                        .log("end process file => ${file:name}")
                .end();

                // OUT FILE 1
                from(ROUTE_FILE_1)
                        .process(new Processor() {
                                public void process(Exchange exchange) throws 
Exception {
                                        if( ! 
exchange.getProperty(PROP_WRITE_IN_FILE_1, Boolean.class).booleanValue())
                                        exchange.getIn().setBody(null);
                                }
                        })
                        
.to("stream:file?fileName=C:/Temp/camel/rep1/out/out_1.csv&closeOnDone=true")
                .end();

                // OUT FILE 2 
                from( ROUTE_FILE_2)
                .process(new Processor() {
                                public void process(Exchange exchange) throws 
Exception {
                                        if( ! 
exchange.getProperty(PROP_WRITE_IN_FILE_2, Boolean.class).booleanValue())
                                        exchange.getIn().setBody(null);
                                }
                        })
                        
.to("stream:file?fileName=C:/Temp/camel/rep1/out/out_2.csv&closeOnDone=true")
                .end();

        }


It complicate the process but it works... 

For me camel doesn't manage correctly the Content Based Router from the EIP 
patterns in the file:stream component 




                
> The logic in stream producer should sync (lock) and not per method which is 
> wrong
> ---------------------------------------------------------------------------------
>
>                 Key: CAMEL-6367
>                 URL: https://issues.apache.org/jira/browse/CAMEL-6367
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-stream
>    Affects Versions: 2.11.0
>            Reporter: jeff
>
> 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.
> Solution : 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.
> 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();

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to