Uploaded image for project: 'Camel'
  1. Camel
  2. CAMEL-6367

The logic in stream producer should sync (lock) and not per method which is wrong

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Resolved
    • Major
    • Resolution: Not A Problem
    • 2.11.0
    • 2.11.1, 2.12.0
    • camel-stream
    • None
    • Unknown

    Description

      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();

      Attachments

        Activity

          People

            davsclaus Claus Ibsen
            0jeff0 jeff
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: