Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: CAMEL-7532

...

Maven users will need to add the following dependency to their pom.xml for this component:

Code Block
xml
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>

URI format

Code Block

velocity:templateName[?options]

...

For example, to set the header value of fruit in the Velocity template .tm:

Code Block

$in.setHeader('fruit', 'Apple')

...

Wiki Markup
{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}

Since Camel-2.14, you can setup a custom Velocity Context yourself by setting the message header CamelVelocityContext just like this

Code Block
languagejava
   VelocityContext velocityContext = new VelocityContext(variableMap);
   exchange.getIn().setHeader("CamelVelocityContext", velocityContext);

 

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.

...

For example you could use something like

Code Block

from("activemq:My.Queue").
  to("velocity:com/acme/MyResponse.vm");

...

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");

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");

And a file based resource:

Code Block

from("activemq:My.Queue").
  to("velocity:file://myfolder/MyResponse.vm?contentCache=true").
  to("activemq:Another.Queue");

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");

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");

...

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}

...

Wiki Markup
{snippet:id=e1|lang=java|url=camel/trunk/components/camel-velocity/src/test/java/org/apache/camel/component/velocity/VelocityLetterTest.java}

Include Page
Endpoint See Also
Endpoint See Also