You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@camel.apache.org by James Green <ja...@gmail.com> on 2015/01/19 18:32:28 UTC

simple recipientlist expansion

.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

Re: simple recipientlist expansion

Posted by James Green <ja...@gmail.com>.
Map? I meant a List<String> on the header, of course.

On 20 January 2015 at 16:00, James Green <ja...@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 <ja...@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 <cl...@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/
>> >>
>>
>>
>

Re: simple recipientlist expansion

Posted by James Green <ja...@gmail.com>.
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 <ja...@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 <cl...@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 <ja...@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/
> >>
>
>

Re: simple recipientlist expansion

Posted by Jakub Korab <ja...@gmail.com>.
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 <cl...@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 <ja...@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/
>>


Re: simple recipientlist expansion

Posted by James Green <ja...@gmail.com>.
You mean a class implementing Expression?

On 19 January 2015 at 17:56, Claus Ibsen <cl...@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 <ja...@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/
>

Re: simple recipientlist expansion

Posted by Claus Ibsen <cl...@gmail.com>.
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 <ja...@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/