Map? I meant a List<String> on the header, of course. On 20 January 2015 at 16:00, James Green <james.mk.gr...@gmail.com> wrote:
> 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/ >> >> >> >> >