James.Strachan wrote:
> 
> 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
> 
> 


James... sorry about that.
I've spotted the bug just before you've replied.
I've added a new queue to my configuration and forgot to change the message
listener configuration... so onMessage was hitting on wrong queue :/

Sorry again for that, it works like a charm now.
-- 
View this message in context: 
http://www.nabble.com/Delay-messages-with-camel-sequentially-tp17144701s22882p17186941.html
Sent from the Camel - Users mailing list archive at Nabble.com.

Reply via email to