You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@camel.apache.org by Mike Spelling <mi...@hotmail.com> on 2012/01/24 16:42:43 UTC

Problems implementing a delay in a camel route









I'm using Camel v2.7.1 and trying to configure a route to apply a delay to incoming messages before passing them on to another queue. I've read about a similar problem at http://osdir.com/ml/users-camel-apache/2010-11/msg00134.html but the answer did not seem to work for me.
I don't think I can use  a <camel:constant> in the <camel:delay> block  as this would block incoming messages, making new messages have to wait for any previous messages to be routed before having another delay applied. The attribute asyncDelayed="true" in the <camel:delay> block appeared to use a thread per message to ensure the correct delay was applied which will quickly use up the maxConcurrentConsumers.
I therefore wanted to pass the delay block a custom method to calculate for correct delay from the JMSHeader Timestamp.








My Camel configuration contains:
<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

   xmlns:camel="http://camel.apache.org/schema/spring"

    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

        http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring-2.0-M1.xsd">



    <bean id="RetryDelayCompute" class="myPackage.RetryDelayCompute" />



    <camel:camelContext autoStartup="true">



        <camel:endpoint id="endpoint-submit-in" uri="activemq:l2vc.pending?transacted=true" />

        <camel:endpoint id="endpoint-submit-retrywait" uri="activemq:l2vc.retrywait" />



        <camel:route autoStartup="true" errorHandlerRef="pending.error"> 
            <camel:from ref="endpoint-submit-retrywait" />             <camel:log message="Routing from retrywait queue..." />

            <camel:delay> 

               <camel:method ref="RetryDelayCompute" method="computeDelay"/>

                <camel:to ref="endpoint-submit-in" />               <camel:log message="Routing to in queue..." /> 

            </camel:delay> 

        </camel:route>



    </camel:camelContext>

</beans>
My bean is below:


package myPackage;
@Componentpublic class RetryDelayCompute {			final static long TOTAL_DELAY_ON_QUEUE = 11000;		public long computeDelay(@Header("JMSTimestamp") long jmsTimestamp) {		System.out.println("Calculating delay...");		long now = System.currentTimeMillis();		long timeOnQueue = now - jmsTimestamp;		return TOTAL_DELAY_ON_QUEUE - timeOnQueue;	}}
On running tests the method is never called. Although the component is instantiated the logs show that the method never runs. Messages are simply routed to the correct queue with no delay.
Any help appreciated!
Thanks,
Mike 		 	   		  

Re: Problems implementing a delay in a camel route

Posted by Christian Müller <ch...@gmail.com>.
We track this issue with https://issues.apache.org/jira/browse/CAMEL-4947

Thanks for reporting,
Christian

On Thu, Jan 26, 2012 at 1:24 PM, Tom Howe <to...@gmail.com> wrote:

> Hi, can anyone help with this.. specifically computeDelay() method never
> appears to be called..
>
>  <camel:delay>
>              <camel:method ref="retryDelayCompute" method="computeDelay"/>
>               <camel:to ref="endpoint-submit-in" />
>               <camel:log message="Routing to in queue..." />
>     </camel:delay>
>
> We are using camel 2.7.1 and found this post which suggests that the above
> config should work..
>
>
> http://camel.465427.n5.nabble.com/Delayer-and-asyncDelayed-how-to-delay-asynchronously-td3252456.html
>
> It seems to work ok using the java DSL eg
> from(...).delay().method(instance, "method").to(..)
>
> Thanks, Tom
>
>
> On Tue, Jan 24, 2012 at 3:42 PM, Mike Spelling <mike_spelling@hotmail.com
> >wrote:
>
> >
> >
> >
> >
> >
> >
> >
> >
> >
> > I'm using Camel v2.7.1 and trying to configure a route to apply a delay
> to
> > incoming messages before passing them on to another queue. I've read
> about
> > a similar problem at
> > http://osdir.com/ml/users-camel-apache/2010-11/msg00134.html but the
> > answer did not seem to work for me.
> > I don't think I can use  a <camel:constant> in the <camel:delay> block
>  as
> > this would block incoming messages, making new messages have to wait for
> > any previous messages to be routed before having another delay applied.
> The
> > attribute asyncDelayed="true" in the <camel:delay> block appeared to use
> a
> > thread per message to ensure the correct delay was applied which will
> > quickly use up the maxConcurrentConsumers.
> > I therefore wanted to pass the delay block a custom method to calculate
> > for correct delay from the JMSHeader Timestamp.
> >
> >
> >
> >
> >
> >
> >
> >
> > My Camel configuration contains:
> > <?xml version="1.0" encoding="UTF-8"?>
> >
> > <beans xmlns="http://www.springframework.org/schema/beans"
> >
> >    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> >
> >   xmlns:camel="http://camel.apache.org/schema/spring"
> >
> >    xsi:schemaLocation="http://www.springframework.org/schema/beans
> > http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
> >
> >        http://camel.apache.org/schema/spring
> > http://camel.apache.org/schema/spring/camel-spring-2.0-M1.xsd">
> >
> >
> >
> >    <bean id="RetryDelayCompute" class="myPackage.RetryDelayCompute" />
> >
> >
> >
> >    <camel:camelContext autoStartup="true">
> >
> >
> >
> >        <camel:endpoint id="endpoint-submit-in"
> > uri="activemq:l2vc.pending?transacted=true" />
> >
> >        <camel:endpoint id="endpoint-submit-retrywait"
> > uri="activemq:l2vc.retrywait" />
> >
> >
> >
> >        <camel:route autoStartup="true" errorHandlerRef="pending.error">
> >            <camel:from ref="endpoint-submit-retrywait" />
> > <camel:log message="Routing from retrywait queue..." />
> >
> >            <camel:delay>
> >
> >               <camel:method ref="RetryDelayCompute"
> method="computeDelay"/>
> >
> >                <camel:to ref="endpoint-submit-in" />
> > <camel:log message="Routing to in queue..." />
> >
> >            </camel:delay>
> >
> >        </camel:route>
> >
> >
> >
> >    </camel:camelContext>
> >
> > </beans>
> > My bean is below:
> >
> >
> > package myPackage;
> > @Componentpublic class RetryDelayCompute {                      final
> > static long TOTAL_DELAY_ON_QUEUE = 11000;         public long
> > computeDelay(@Header("JMSTimestamp") long jmsTimestamp) {
> > System.out.println("Calculating delay...");             long now =
> > System.currentTimeMillis();          long timeOnQueue = now -
> jmsTimestamp;
> >          return TOTAL_DELAY_ON_QUEUE - timeOnQueue;      }}
> > On running tests the method is never called. Although the component is
> > instantiated the logs show that the method never runs. Messages are
> simply
> > routed to the correct queue with no delay.
> > Any help appreciated!
> > Thanks,
> > Mike
>

Re: Problems implementing a delay in a camel route

Posted by Tom Howe <to...@gmail.com>.
Hi, can anyone help with this.. specifically computeDelay() method never
appears to be called..

  <camel:delay>
              <camel:method ref="retryDelayCompute" method="computeDelay"/>
               <camel:to ref="endpoint-submit-in" />
               <camel:log message="Routing to in queue..." />
     </camel:delay>

We are using camel 2.7.1 and found this post which suggests that the above
config should work..

http://camel.465427.n5.nabble.com/Delayer-and-asyncDelayed-how-to-delay-asynchronously-td3252456.html

It seems to work ok using the java DSL eg
from(...).delay().method(instance, "method").to(..)

Thanks, Tom


On Tue, Jan 24, 2012 at 3:42 PM, Mike Spelling <mi...@hotmail.com>wrote:

>
>
>
>
>
>
>
>
>
> I'm using Camel v2.7.1 and trying to configure a route to apply a delay to
> incoming messages before passing them on to another queue. I've read about
> a similar problem at
> http://osdir.com/ml/users-camel-apache/2010-11/msg00134.html but the
> answer did not seem to work for me.
> I don't think I can use  a <camel:constant> in the <camel:delay> block  as
> this would block incoming messages, making new messages have to wait for
> any previous messages to be routed before having another delay applied. The
> attribute asyncDelayed="true" in the <camel:delay> block appeared to use a
> thread per message to ensure the correct delay was applied which will
> quickly use up the maxConcurrentConsumers.
> I therefore wanted to pass the delay block a custom method to calculate
> for correct delay from the JMSHeader Timestamp.
>
>
>
>
>
>
>
>
> My Camel configuration contains:
> <?xml version="1.0" encoding="UTF-8"?>
>
> <beans xmlns="http://www.springframework.org/schema/beans"
>
>    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>
>   xmlns:camel="http://camel.apache.org/schema/spring"
>
>    xsi:schemaLocation="http://www.springframework.org/schema/beans
> http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
>
>        http://camel.apache.org/schema/spring
> http://camel.apache.org/schema/spring/camel-spring-2.0-M1.xsd">
>
>
>
>    <bean id="RetryDelayCompute" class="myPackage.RetryDelayCompute" />
>
>
>
>    <camel:camelContext autoStartup="true">
>
>
>
>        <camel:endpoint id="endpoint-submit-in"
> uri="activemq:l2vc.pending?transacted=true" />
>
>        <camel:endpoint id="endpoint-submit-retrywait"
> uri="activemq:l2vc.retrywait" />
>
>
>
>        <camel:route autoStartup="true" errorHandlerRef="pending.error">
>            <camel:from ref="endpoint-submit-retrywait" />
> <camel:log message="Routing from retrywait queue..." />
>
>            <camel:delay>
>
>               <camel:method ref="RetryDelayCompute" method="computeDelay"/>
>
>                <camel:to ref="endpoint-submit-in" />
> <camel:log message="Routing to in queue..." />
>
>            </camel:delay>
>
>        </camel:route>
>
>
>
>    </camel:camelContext>
>
> </beans>
> My bean is below:
>
>
> package myPackage;
> @Componentpublic class RetryDelayCompute {                      final
> static long TOTAL_DELAY_ON_QUEUE = 11000;         public long
> computeDelay(@Header("JMSTimestamp") long jmsTimestamp) {
> System.out.println("Calculating delay...");             long now =
> System.currentTimeMillis();          long timeOnQueue = now - jmsTimestamp;
>          return TOTAL_DELAY_ON_QUEUE - timeOnQueue;      }}
> On running tests the method is never called. Although the component is
> instantiated the logs show that the method never runs. Messages are simply
> routed to the correct queue with no delay.
> Any help appreciated!
> Thanks,
> Mike