2008/5/12 Krystian Szczesny <[EMAIL PROTECTED]>:
> James.Strachan wrote:
> >
> > 2008/5/9 Krystian Szczesny <[EMAIL PROTECTED]>:
> >>
> >>
> >>
> >> James.Strachan wrote:
> >>>
> >>> 2008/5/9 Krystian Szczesny <[EMAIL PROTECTED]>:
> >>>>
> >>>> Hi,
> >>>>
> >>>>
> >>>> Before, when delaying single messages I've used for example
> >>>> delayer(3000)
> >>>> and it worked flawlessly.
> >>>> Now I need to delay a sequence of messages, so when I send 5 messages,
> >>>> the
> >>>> first should be delayed by 3000, second by 6000 etc...
> >>>>
> >>>> Is there any way I could do that with Camel?
> >>>
> >>> You just need to use an expression for the time that the message is to
> >>> be sent at. So you could do something like...
> >>>
> >>> from("activemq:foo").delay().method("someBean",
> >>> "sendAtTime").to("activemq:bar");
> >>>
> >>> then the bean would look like this...
> >>>
> >>> public class SomeBean {
> >>> public long sendAtTime(@Header("MyDelayHeader") long delay) {
> >>> if (delay <= 0) delay = 3000;
> >>> return System.currentTimeMillis() + delay;
> >>> }
> >>> }
> >>>
> >>> which would look for the MyDelayHeader on the message and use that as
> >>> the
> >>> delay.
> >>>
> >>>
> >>> --
> >>> James
> >>> -------
> >>> http://macstrac.blogspot.com/
> >>>
> >>> Open Source Integration
> >>> http://open.iona.com
> >>>
> >>>
> >> Hi James,
> >>
> >> thanks for fast answer.
> >> One more thing if you could...
> >> I am using spring to configure the whole thing:
> >>
> >> <camelContext id="camel"
> >> xmlns="http://activemq.apache.org/camel/schema/spring">
> >> <route>
> >> <from uri="activemq:queue:Input" />
> >> <delayer>
> >> <simple>header.JMSTimestamp</simple>
> >> <to uri="activemq:queue:Delayed" />
> >> <delay>3000</delay>
> >> </delayer>
> >> </route>
> >> </camelContext>
> >>
> >> How can I add "method("someBean","sendAtTime")" to this configuration?
> >
> > <delayer>
> > <methodCall bean="something" method="sendAtTime"/>
> > ...
> > </delayer>
> >
> > For more details, configure your IDE to use the XSD...
> > http://activemq.apache.org/camel/schema/spring/camel-spring-1.3.0.xsd
> >
> > then you'll get smart completion
> >
> > --
> > James
> > -------
> > http://macstrac.blogspot.com/
> >
> > Open Source Integration
> > http://open.iona.com
> >
> >
>
> Thx James,
>
> I've configured Eclipse to use the xsd file, but it does not support smart
> completion i guess, it shows everything there is. But never mind that.
Strange - works for me in IntellIJ though :)
>
> I've tried couple of scenarios [delay method returns
> System.currentTimeMillis() + 5000]:
>
> FIRST
> <camel:camelContext id="camel">
> <camel:route>
> <camel:from uri="activemq:queue:Delayed" />
> <camel:delayer>
> <camel:methodCall bean="delayerBean"
> method="delay"/>
> <camel:to uri="activemq:queue:Output"
> />
> </camel:delayer>
> </camel:route>
> </camel:camelContext>
>
> Message is delivered to consumer of Output queue before the delay method is
> being called.
>
> SECOND:
> <camel:camelContext id="camel">
> <camel:route>
> <camel:from uri="activemq:queue:Delayed" />
> <camel:delayer>
> <camel:methodCall bean="delayerBean"
> method="delay"/>
> </camel:delayer>
> <camel:to uri="activemq:queue:Output" />
> </camel:route>
> </camel:camelContext>
> Result: same as above - message is consumed before the delay method is
> called.
>
> Then I've tried with a class:
> public class CamelRoute extends RouteBuilder {
>
> @Override
> public void configure() throws Exception {
> from("activemq:queue:Delayed").delayer().method("delayerBean",
> "delay").to("activemq:queue:Output");
> }
> }
>
> and still same result. Message is sent to Output without any delay :/
>
> What am I doing wrong?
Your code looks valid to me; I guess there's some kinda bug in there
somewhere. Will try take a look soon (I'm in the middle of a big
refactor...)
--
James
-------
http://macstrac.blogspot.com/
Open Source Integration
http://open.iona.com