Velocity
The velocity: component allows you to process a message using an Apache Velocity template. This can be ideal when using Templating to generate responses for requests.
Maven users will need to add the following dependency to their pom.xml
for this component:
Code Block | ||||
---|---|---|---|---|
| ||||
Wiki Markup | ||||
h2. Velocity The *velocity:* component allows you to process a message using an [Apache Velocity|http://velocity.apache.org/] template. This can be ideal when using [Templating] to generate responses for requests. Maven users will need to add the following dependency to their {{pom.xml}} for this component: {code:xml} <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-velocity</artifactId> <version>x.x.x</version> <!-- use the same version as your Camel core version --> </dependency> {code} h3. URI format {code} |
URI format
Code Block |
---|
velocity:templateName[?options]
{code}
Where *templateName* is the |
Where templateName is the classpath-local
...
URI
...
of
...
the
...
template
...
to
...
invoke;
...
or
...
the
...
complete
...
URL
...
of
...
the
...
remote
...
template
...
(eg:
...
...
You
...
can
...
append
...
query
...
options
...
to
...
the
...
URI
...
in
...
the
...
following
...
format,
...
?option=value&option=value&...
Options
Wiki Markup |
---|
}} h3. Options {div:class=confluenceTableSmall} || Option || Default || Description || | {{loaderCache}} | {{true}} | Velocity based file loader cache. | | {{contentCache}} | {{true}} | Cache for the resource content when it is loaded. \\ Note : as of Camel 2.9 cached resource content can be cleared via JMX using the endpoint's {{clearContentCache}} operation. | | {{encoding}} | {{null}} | Character encoding of the resource content. | | {{propertiesFile}} | {{null}} | New option in Camel 2.1: The URI of the properties file which is used for VelocityEngine initialization. | {div} h3. |
Message
...
Headers
...
The
...
velocity
...
component
...
sets
...
a
...
couple
...
headers
...
on
...
the
...
message
...
(you
...
can't
...
set
...
these
...
yourself
...
and
...
from
...
Camel
...
2.1
...
velocity
...
component
...
will
...
not
...
set
...
these
...
headers
...
which
...
will
...
cause
...
some
...
side
...
effect
...
on
...
the
...
dynamic
...
template
...
support):
Wiki Markup |
---|
{div:class=confluenceTableSmall} || Header || Description || | {{CamelVelocityResourceUri}} | The *templateName* as a {{String}} object. | {div} |
Headers
...
set
...
during
...
the
...
Velocity
...
evaluation
...
are
...
returned
...
to
...
the
...
message
...
and
...
added
...
as
...
headers.
...
Then
...
its
...
kinda
...
possible
...
to
...
return
...
values
...
from
...
Velocity
...
to
...
the
...
Message.
...
For
...
example,
...
to
...
set
...
the
...
header
...
value
...
of
...
fruit
...
in
...
the
...
Velocity
...
template
...
.tm
...
:
Code Block |
---|
} $in.setHeader('fruit', 'Apple') {code} The {{fruit}} header is now accessible from the {{ |
The fruit
header is now accessible from the message.out.headers
.
Velocity Context
Camel will provide exchange information in the Velocity context (just a Map
). The Exchange
is transfered as:
Wiki Markup |
---|
}}. h3. Velocity Context Camel will provide exchange information in the Velocity context (just a {{Map}}). The {{Exchange}} is transfered as: {div:class=confluenceTableSmall} || key || value || | {{exchange}} | The {{Exchange}} itself. | | {{exchange.properties}} | The {{Exchange}} properties. | | {{headers}} | The headers of the In message. | | {{camelContext}} | The Camel Context intance. | | {{request}} | The In message. | | {{in}} | The In message. | | {{body}} | The In message body. | | {{out}} | The Out message (only for InOut message exchange pattern). | | {{response}} | The Out message (only for InOut message exchange pattern). | {div} h3. |
Hot
...
reloading
...
The
...
Velocity
...
template
...
resource
...
is,
...
by
...
default,
...
hot
...
reloadable
...
for
...
both
...
file
...
and
...
classpath
...
resources
...
(expanded
...
jar).
...
If
...
you
...
set
...
contentCache=true
...
,
...
Camel
...
will
...
only
...
load
...
the
...
resource
...
once,
...
and
...
thus
...
hot
...
reloading
...
is
...
not
...
possible.
...
This
...
scenario
...
can
...
be
...
used
...
in
...
production,
...
when
...
the
...
resource
...
never
...
changes.
...
Dynamic
...
templates
...
Available
...
as
...
of
...
Camel
...
2.1
...
Camel
...
provides
...
two
...
headers
...
by
...
which
...
you
...
can
...
define
...
a
...
different
...
resource
...
location
...
for
...
a
...
template
...
or
...
the
...
template
...
content
...
itself.
...
If
...
any
...
of
...
these
...
headers
...
is
...
set
...
then
...
Camel
...
uses
...
this
...
over
...
the
...
endpoint
...
configured
...
resource.
...
This
...
allows
...
you
...
to
...
provide
...
a
...
dynamic
...
template
...
at
...
runtime.
Wiki Markup |
---|
{div:class=confluenceTableSmall} || Header || Type || Description || | CamelVelocityResourceUri | String | *Camel 2.1:* A URI for the template resource to use instead of the endpoint configured. | | CamelVelocityTemplate | String | *Camel 2.1:* The template to use instead of the endpoint configured. | {div} h3. Samples For example you could use something like {code} |
Samples
For example you could use something like
Code Block |
---|
from("activemq:My.Queue").
to("velocity:com/acme/MyResponse.vm");
{code}
|
To
...
use
...
a
...
Velocity
...
template
...
to
...
formulate
...
a
...
response
...
to
...
a
...
message
...
for
...
InOut
...
message
...
exchanges
...
(where
...
there
...
is
...
a
...
JMSReplyTo
...
header).
...
If
...
you
...
want
...
to
...
use
...
InOnly
...
and
...
consume
...
the
...
message
...
and
...
send
...
it
...
to
...
another
...
destination,
...
you
...
could
...
use
...
the
...
following
...
route:
Code Block |
---|
} from("activemq:My.Queue"). to("velocity:com/acme/MyResponse.vm"). to("activemq:Another.Queue"); {code} |
And
...
to
...
use
...
the
...
content
...
cache,
...
e.g.
...
for
...
use
...
in
...
production,
...
where
...
the
...
.vm
...
template
...
never
...
changes:
Code Block |
---|
} from("activemq:My.Queue"). to("velocity:com/acme/MyResponse.vm?contentCache=true"). to("activemq:Another.Queue"); {code} |
And
...
a
...
file
...
based
...
resource:
Code Block |
---|
} from("activemq:My.Queue"). to("velocity:file://myfolder/MyResponse.vm?contentCache=true"). to("activemq:Another.Queue"); {code} In *Camel |
In Camel 2.1
...
it's
...
possible
...
to
...
specify
...
what
...
template
...
the
...
component
...
should
...
use
...
dynamically
...
via
...
a
...
header,
...
so
...
for
...
example:
Code Block |
---|
} from("direct:in"). setHeader("CamelVelocityResourceUri").constant("path/to/my/template.vm"). to("velocity:dummy"); {code} In *Camel |
In Camel 2.1
...
it's
...
possible
...
to
...
specify
...
a
...
template
...
directly
...
as
...
a
...
header
...
the
...
component
...
should
...
use
...
dynamically
...
via
...
a
...
header,
...
so
...
for
...
example:
Code Block |
---|
} from("direct:in"). setHeader("CamelVelocityTemplate").constant("Hi this is a velocity template that can do templating ${body}"). to("velocity:dummy"); {code} h3. The Email Sample In this sample we want to use Velocity templating for an order confirmation email. The email template is laid out in Velocity as: {code |
The Email Sample
In this sample we want to use Velocity templating for an order confirmation email. The email template is laid out in Velocity as:
Code Block |
---|
} Dear ${headers.lastName}, ${headers.firstName} Thanks for the order of ${headers.item}. Regards Camel Riders Bookstore ${body} {code} |
And
...
the
...
java
...
code:
Wiki Markup |
---|
{snippet:id=e1|lang=java|url=camel/trunk/components/camel-velocity/src/test/java/org/apache/camel/component/velocity/VelocityLetterTest.java} {include:Endpoint See Also} |
Include Page | ||||
---|---|---|---|---|
|