Hello list,
I'm using Camel 2.4 (inside FUSE ESB 4.3). For a POC (prove of concept) I
have to read a file with multiple address lines like this one:
{code}
1,Hahnstr,1,60525,Frankfurt
...
10000,Hahnstr,10000,60525,Frankfurt
{code}

Afterwards I have to call a web service (which makes the address updates on
our customer database). The web service respond with the id (the first
number in the input file) and the status (UPDATED). I have to write a result
file for each processed record which should looks like (the order of the
entries is not relevant):
{code}
1,UPDATED
...
10000,UPDATED
{code}

My first solution which works fine was the following:

{code}
from("file:src/test/data?noop=true").routeId("POC-main")
  .split(body().tokenize("\n"), new
PocResultAggregationStrategy()).parallelProcessing().streaming()
    .inOut("direct:addressService")
  .end()
  .inOnly(targetFileResourcePath);

from("direct:addressUpdateService").routeId("POC-addressUpdateService")
  .convertBodyTo(UpdateAddress.class)
  .inOut("cxf:bean:addressService")
  .convertBodyTo(String.class);
{code}

After thinking about this solution, it has a few cons:
1) I didn't use a persistent aggregator which could be result in loosing all
aggregated messages if someone shutdown the ESB.
2) The Aggregator looks a bit 'overingenieurd' for this requirement because
I only append new lines.

I tryied to implement a smarter solution and came up with this one:

{code}
from("file:src/test/data?noop=true").routeId("POC-main")
  .split(body().tokenize("\n")).parallelProcessing().streaming()
    .inOut("direct:addressService")
    .inOnly("file:target/outbox?fileExist=Append")
  .end();

from("direct:addressUpdateService").routeId("POC-addressUpdateService")
  .convertBodyTo(UpdateAddress.class)
  .inOut("cxf:bean:addressService")
  .convertBodyTo(String.class);
{code}

But unfortunately, the result file only contained 9897 lines instead of
10000. :-(
I couldn't find an option in the file-component to lock the file, so that
only one thread can manipulate the file in one time.

My question is: Does the Camel file producer has an option for that? If not,
should the file producer has an option like: writeLock=fileLock (similar to
the readLock option of the file consumer)? Then maybe we also need an option
to specify how long Camel should wait for the lock until it fails...

What you are thinking?

Thanks in advance for your feedback,
Christian

-- 
View this message in context: 
http://camel.465427.n5.nabble.com/Using-Splitter-and-file-producer-with-option-fileExist-Append-failed-tp3353618p3353618.html
Sent from the Camel - Users mailing list archive at Nabble.com.

Reply via email to