I ended up with a Processor that built a new Map on a header iterating over the media and prefixing each in the header variant.
I may in-line this in the camel route (as per your example) to level the knowledge a little better though. Thanks for the suggestions. On 20 January 2015 at 15:16, Jakub Korab <jakub.korab.li...@gmail.com> wrote: > One way to do this is to assemble the list of destinations in a header, > then reference that. Here's a rough example: > > .process( new Processor() { > public void process(Exchange exchange) { > Message in = exchange.getIn(); > List<String> mediaList = ((YourPojo) in.getBody()).getMedia(); > String destinations = ""; > int i = 0; > for (String media : mediaList) { > if (i++ > 0) { > destinations += ","; > } > destinations += "direct:" + media; > } > in.setHeader("mediaDestinations", destinations); > } > }) > .recipientList(header("mediaDestinations")) > > This has a nice side-effect of making it really easy to debug by > dropping a log statement before the recipientList. > You could also use bean binding instead of a processor: > > .setHeader(method(new MyRouter(), "route(${body.media})")) > > with a class like: > > public class MyRouter { > public String route(List<String> media) {...} // returns > comma-seperated endpoints > } > > Jakub > > On 19/01/15 18:01, James Green wrote: > > You mean a class implementing Expression? > > > > On 19 January 2015 at 17:56, Claus Ibsen <claus.ib...@gmail.com> wrote: > > > >> You can use a method call expression (aka java bean) where you add the > >> direct: prefix to the media headers. > >> > >> Or try look at groovy or something which may be able to prefix to a > >> list. I think I have seen that done in fabric8 v1. > >> > >> > >> On Mon, Jan 19, 2015 at 6:32 PM, James Green <james.mk.gr...@gmail.com> > >> wrote: > >>> .recipientList(simple("direct:${body.media}")) > >>> > >>> So media is a List<String> property where each entry has a media value: > >>> "sms", "email", etc. > >>> > >>> What I get out of this is an exception (where "sms" is the only media): > >>> > >>> org.apache.camel.component.direct.DirectConsumerNotAvailableException: > No > >>> consumers available on endpoint: Endpoint[direct://%5Bsms%5D]. > >>> > >>> If I remove the direct: from the simple expression and place it > directly > >> in > >>> the media property value it works fine. But then my POJO "knows" about > >>> direct: prefixes. Not what I had hoped. > >>> > >>> Any ideas? I can't use transform() as the rest of the message needs to > be > >>> passed onwards. > >>> > >>> James > >> > >> > >> -- > >> Claus Ibsen > >> ----------------- > >> Red Hat, Inc. > >> Email: cib...@redhat.com > >> Twitter: davsclaus > >> Blog: http://davsclaus.com > >> Author of Camel in Action: http://www.manning.com/ibsen > >> hawtio: http://hawt.io/ > >> fabric8: http://fabric8.io/ > >> > >