Passing params between lifecycle managed routes

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

Passing params between lifecycle managed routes

nomit babraa
Hello

Forgive any lack of understanding as I'm still learning.

I have route A that is started and consuming from Queue1,

I also have route B consuming from Queue2. This route is suspended
onStart using a custom RoutePolicy.

When route A gets a message, this message is consumed, processed and
then the final step in Route A is to suspend itself and then resume
route B.

Route B wakes up and consumes messages from Queue2 using a JMS
selector, processes them and then the  final step in Route B is to
suspend itself and then resume route A......

I'm trying to pass a variable (the selector)  from route A to route B
but exchange properties and message headers, set in route A, both seem
null in Route B.

Is something being lost through the lifecycle management (which I do
using the controlBus)?

Is there a way to pass this value from route A to B?

 It feels like I should want to pass it direct to keep the Scope of
the variable correct.



cheers

n
Reply | Threaded
Open this post in threaded view
|

Re: Passing params between lifecycle managed routes

Claus Ibsen-2
Hi

You can use a java bean to share state, and call it from the routes,
just make sure the java bean is singleton scoped.


On Thu, Feb 27, 2020 at 11:01 AM nomit babraa <[hidden email]> wrote:

>
> Hello
>
> Forgive any lack of understanding as I'm still learning.
>
> I have route A that is started and consuming from Queue1,
>
> I also have route B consuming from Queue2. This route is suspended
> onStart using a custom RoutePolicy.
>
> When route A gets a message, this message is consumed, processed and
> then the final step in Route A is to suspend itself and then resume
> route B.
>
> Route B wakes up and consumes messages from Queue2 using a JMS
> selector, processes them and then the  final step in Route B is to
> suspend itself and then resume route A......
>
> I'm trying to pass a variable (the selector)  from route A to route B
> but exchange properties and message headers, set in route A, both seem
> null in Route B.
>
> Is something being lost through the lifecycle management (which I do
> using the controlBus)?
>
> Is there a way to pass this value from route A to B?
>
>  It feels like I should want to pass it direct to keep the Scope of
> the variable correct.
>
>
>
> cheers
>
> n



--
Claus Ibsen
-----------------
http://davsclaus.com @davsclaus
Camel in Action 2: https://www.manning.com/ibsen2
Reply | Threaded
Open this post in threaded view
|

Re: Passing params between lifecycle managed routes

nomit babraa
Hi

Many thanks for that.
I have implemented a bean to be called in both routes.

https://camel.apache.org/manual/latest/bean-eip.html seems to say the scope
is Singleton as default so hopefully it's defined as singleton.

(I'm using Talend to build my routes so not sure but I think each Talend
Job is using it's own camel context and RouteBuilder class so the bean
should also be scoped to one Talend Job.)

In terms of thread safety I'm not sure if I need to do anything more than
the below.

My design is to only have one route accessing the bean at any time...

My implementation is; I stop route a, pass value to bean, and start route b
with:

...



* .multicast()
 .to("controlbus:route?routeId=routea&action=suspend&async=true")
 .to("bean:myBean?method=setSelector(${in.header.JMSXGroupID})");
 .to("controlbus:route?routeId=routeb&action=resume&async=true")*
*...*


Is the multicast order guaranteed?

If so then I can be happy that everything will happen as designed

Cheers

n



On Thu, 27 Feb 2020 at 10:05, Claus Ibsen <[hidden email]> wrote:

> Hi
>
> You can use a java bean to share state, and call it from the routes,
> just make sure the java bean is singleton scoped.
>
>
> On Thu, Feb 27, 2020 at 11:01 AM nomit babraa <[hidden email]>
> wrote:
> >
> > Hello
> >
> > Forgive any lack of understanding as I'm still learning.
> >
> > I have route A that is started and consuming from Queue1,
> >
> > I also have route B consuming from Queue2. This route is suspended
> > onStart using a custom RoutePolicy.
> >
> > When route A gets a message, this message is consumed, processed and
> > then the final step in Route A is to suspend itself and then resume
> > route B.
> >
> > Route B wakes up and consumes messages from Queue2 using a JMS
> > selector, processes them and then the  final step in Route B is to
> > suspend itself and then resume route A......
> >
> > I'm trying to pass a variable (the selector)  from route A to route B
> > but exchange properties and message headers, set in route A, both seem
> > null in Route B.
> >
> > Is something being lost through the lifecycle management (which I do
> > using the controlBus)?
> >
> > Is there a way to pass this value from route A to B?
> >
> >  It feels like I should want to pass it direct to keep the Scope of
> > the variable correct.
> >
> >
> >
> > cheers
> >
> > n
>
>
>
> --
> Claus Ibsen
> -----------------
> http://davsclaus.com @davsclaus
> Camel in Action 2: https://www.manning.com/ibsen2
>
Reply | Threaded
Open this post in threaded view
|

Re: Passing params between lifecycle managed routes

nomit babraa
opps - spotted type in my code.

should be

...



* .multicast()
 .to("controlbus:route?routeId=routea&action=suspend&async=true")
 .to("bean:myBean?method=setSelector(${in.header.JMSXGroupID})")
 .to("controlbus:route?routeId=routeb&action=resume&async=true")*
*...*


On Fri, 28 Feb 2020 at 09:20, nomit babraa <[hidden email]> wrote:

> Hi
>
> Many thanks for that.
> I have implemented a bean to be called in both routes.
>
> https://camel.apache.org/manual/latest/bean-eip.html seems to say the
> scope is Singleton as default so hopefully it's defined as singleton.
>
> (I'm using Talend to build my routes so not sure but I think each Talend
> Job is using it's own camel context and RouteBuilder class so the bean
> should also be scoped to one Talend Job.)
>
> In terms of thread safety I'm not sure if I need to do anything more than
> the below.
>
> My design is to only have one route accessing the bean at any time...
>
> My implementation is; I stop route a, pass value to bean, and start route
> b with:
>
> ...
>
>
>
> * .multicast()
>  .to("controlbus:route?routeId=routea&action=suspend&async=true")
>  .to("bean:myBean?method=setSelector(${in.header.JMSXGroupID})");
>  .to("controlbus:route?routeId=routeb&action=resume&async=true")*
> *...*
>
>
> Is the multicast order guaranteed?
>
> If so then I can be happy that everything will happen as designed
>
> Cheers
>
> n
>
>
>
> On Thu, 27 Feb 2020 at 10:05, Claus Ibsen <[hidden email]> wrote:
>
>> Hi
>>
>> You can use a java bean to share state, and call it from the routes,
>> just make sure the java bean is singleton scoped.
>>
>>
>> On Thu, Feb 27, 2020 at 11:01 AM nomit babraa <[hidden email]>
>> wrote:
>> >
>> > Hello
>> >
>> > Forgive any lack of understanding as I'm still learning.
>> >
>> > I have route A that is started and consuming from Queue1,
>> >
>> > I also have route B consuming from Queue2. This route is suspended
>> > onStart using a custom RoutePolicy.
>> >
>> > When route A gets a message, this message is consumed, processed and
>> > then the final step in Route A is to suspend itself and then resume
>> > route B.
>> >
>> > Route B wakes up and consumes messages from Queue2 using a JMS
>> > selector, processes them and then the  final step in Route B is to
>> > suspend itself and then resume route A......
>> >
>> > I'm trying to pass a variable (the selector)  from route A to route B
>> > but exchange properties and message headers, set in route A, both seem
>> > null in Route B.
>> >
>> > Is something being lost through the lifecycle management (which I do
>> > using the controlBus)?
>> >
>> > Is there a way to pass this value from route A to B?
>> >
>> >  It feels like I should want to pass it direct to keep the Scope of
>> > the variable correct.
>> >
>> >
>> >
>> > cheers
>> >
>> > n
>>
>>
>>
>> --
>> Claus Ibsen
>> -----------------
>> http://davsclaus.com @davsclaus
>> Camel in Action 2: https://www.manning.com/ibsen2
>>
>
>
>