blob: d4ce0f3eaf7a5b8fbaecd05c0fa283cef0bf89a2 [file] [log] [blame]
= Timer Component
:doctitle: Timer
:shortname: timer
:artifactid: camel-timer
:description: Generate messages in specified intervals using java.util.Timer.
:since: 1.0
:supportlevel: Stable
:tabs-sync-option:
:component-header: Only consumer is supported
:core:
//Manually maintained attributes
:camel-spring-boot-name: timer
*Since Camel {since}*
*{component-header}*
The Timer component is used to generate message exchanges when a
timer fires. You can only consume events from this endpoint.
== URI format
----
timer:name[?options]
----
Where `name` is the name of the `Timer` object, which is created and
shared across endpoints. So if you use the same name for all your timer
endpoints, only one `Timer` object and thread will be used.
NOTE: The _IN_ body of the generated exchange is `null`.
Therefore, calling `exchange.getIn().getBody()` returns `null`.
[TIP]
====
*Advanced Scheduler*
See also the xref:quartz-component.adoc[Quartz] component that supports much more
advanced scheduling.
====
// component options: START
include::partial$component-configure-options.adoc[]
include::partial$component-endpoint-options.adoc[]
include::partial$component-endpoint-headers.adoc[]
// component options: END
== Usage
=== Exchange Properties
When the timer is fired, it adds the following information as properties
to the `Exchange`:
[width="100%",cols="10%,10%,80%",options="header",]
|===
|Name |Type |Description
|`Exchange.TIMER_NAME` |`String` |The value of the `name` option.
|`Exchange.TIMER_TIME` |`Date` |The value of the `time` option.
|`Exchange.TIMER_PERIOD` |`long` |The value of the `period` option.
|`Exchange.TIMER_FIRED_TIME` |`Date` |The time when the consumer fired.
|`Exchange.TIMER_COUNTER` |`Long` |The current fire counter. Starts from 1.
|===
== Example
To set up a route that generates an event every 60 seconds:
[source,java]
----
from("timer://foo?fixedRate=true&period=60000").to("bean:myBean?method=someMethodName");
----
The above route will generate an event and then invoke the
`someMethodName` method on the bean called `myBean` in the
Registry.
And the route in Spring DSL:
[source,xml]
-----
<route>
<from uri="timer://foo?fixedRate=true&amp;period=60000"/>
<to uri="bean:myBean?method=someMethodName"/>
</route>
-----
=== Firing as soon as possible
You may want to fire messages in a Camel route as soon as possible, you
can use a negative delay:
[source,xml]
----
<route>
<from uri="timer://foo?delay=-1"/>
<to uri="bean:myBean?method=someMethodName"/>
</route>
----
In this way, the timer will fire messages immediately.
You can also specify a `repeatCount` parameter in conjunction with a
negative delay to stop firing messages after a fixed number has been
reached.
If you don't specify a `repeatCount` then the timer will continue firing
messages until the route will be stopped.
=== Firing only once
You may want to fire a message in a Camel route only once, such as when
starting the route.
To do that, you use the `repeatCount` option as shown:
[source,xml]
----
<route>
<from uri="timer://foo?repeatCount=1"/>
<to uri="bean:myBean?method=someMethodName"/>
</route>
----
include::spring-boot:partial$starter.adoc[]