Thanks Claus. It is still verbose/error prone - I have to repeat it every time I use such a processor (verbose) and I have to remember to do it (error prone). And that assumes I *know* that I have to do it in the first place - I don't know how I can tell whether a given processor holds a lock around all downstream processing without detailed inspection of the source.
Here's an extreme example to illustrate what I mean: from("direct:a") .threads(5) // set up a thread pool .bean(dostuff) // excellent, stuff is done in parallel on 5 threads - happy days. .aggregate(...) // I'm a good dev and remembered to RE-introduce a threadpool using executorService, otherwise camel will not execute any of the following in the thread pool I made above. .executorService(...) .multicast(...) // does multicast() acquire a big lock on downstream work just like aggregate? .executorService(...) // (...better process downstream on another executor service to be sure) .delay(1000) // maybe delay will lock too? Add another executorService! .executorService(...) .log("got a msg") // how about now? Maybe log() locks all downstream threads too just like aggregate! Who knows? .threads(5) // shall I just reintroduce the threadpool on every other line, just to be absolutely sure? .someOtherBuiltInCamelProcessor() .threads(5) // ... if not, how can I know *when* I need to reintroduce it? Camel may arbitrarily lock me out! // etc How can I reason about my system's behaviour without knowing which parts of my code will be executed under a seemingly arbitrary mutual exclusion lock? Which processors take this lock, and why? Again, thanks for your time. Barış