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