camel-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From James Green <james.mk.gr...@gmail.com>
Subject Re: simple recipientlist expansion
Date Tue, 20 Jan 2015 16:01:02 GMT
Map? I meant a List<String> on the header, of course.

On 20 January 2015 at 16:00, James Green <james.mk.green@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.lists@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.ibsen@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.green@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: cibsen@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/
>> >>
>>
>>
>

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message