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/