[[MVELComponent-MVELComponent]]
MVEL Component
~~~~~~~~~~~~~~

*Available as of Camel 2.12*

The *mvel:* component allows you to process a message using an
http://mvel.codehaus.org/[MVEL] template. This can be ideal when using
link:templating.html[Templating] to generate responses for requests.

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

[source,xml]
------------------------------------------------------------
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-mvel</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>
------------------------------------------------------------

[[MVELComponent-URIformat]]
URI format
^^^^^^^^^^

[source,java]
---------------------------
mvel:templateName[?options]
---------------------------

Where *templateName* is the classpath-local URI of the template to
invoke; or the complete URL of the remote template (eg:
file://folder/myfile.mvel[file://folder/myfile.mvel]).

You can append query options to the URI in the following format,
`?option=value&option=value&...`

[[MVELComponent-Options]]
Options
^^^^^^^


// component options: START
The MVEL component has no options.
// component options: END




// endpoint options: START
The MVEL component supports 4 endpoint options which are listed below:

{% raw %}
[width="100%",cols="2,1,1m,1m,5",options="header"]
|=======================================================================
| Name | Group | Default | Java Type | Description
| resourceUri | producer |  | String | *Required* Path to the resource or a reference to lookup a bean in the Registry to use as the resource
| contentCache | producer | false | boolean | Sets whether to use resource content cache or not
| encoding | producer |  | String | Character encoding of the resource content.
| synchronous | advanced | false | boolean | Sets whether synchronous processing should be strictly used or Camel is allowed to use asynchronous processing (if supported).
|=======================================================================
{% endraw %}
// endpoint options: END



[[MVELComponent-MessageHeaders]]
Message Headers
^^^^^^^^^^^^^^^

The mvel component sets a couple headers on the message.

[width="100%",cols="10%,90%",options="header",]
|=======================================================================
|Header |Description

|`CamelMvelResourceUri` |The *templateName* as a `String` object.
|=======================================================================

[[MVELComponent-MVELContext]]
MVEL Context
^^^^^^^^^^^^

Camel will provide exchange information in the MVEL context (just a
`Map`). The `Exchange` is transfered as:

[width="100%",cols="10%,90%",options="header",]
|=======================================================================
|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).
|=======================================================================

[[MVELComponent-Hotreloading]]
Hot reloading
^^^^^^^^^^^^^

The mvel 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.

[[MVELComponent-Dynamictemplates]]
Dynamic templates
^^^^^^^^^^^^^^^^^

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.

[width="100%",cols="10%,10%,80%",options="header",]
|=======================================================================
|Header |Type |Description

|CamelMvelResourceUri |String |A URI for the template resource to use instead of the endpoint
configured.

|CamelMvelTemplate |String |The template to use instead of the endpoint configured.
|=======================================================================

[[MVELComponent-Samples]]
Samples
^^^^^^^

For example you could use something like

[source,java]
--------------------------------------
from("activemq:My.Queue").
  to("mvel:com/acme/MyResponse.mvel");
--------------------------------------

To use a MVEL template to formulate a response to a message for InOut
message exchanges (where there is a `JMSReplyTo` header).

To specify what template the component should use dynamically via a
header, so for example:

[source,java]
-------------------------------------------------------------------------
from("direct:in").
  setHeader("CamelMvelResourceUri").constant("path/to/my/template.mvel").
  to("mvel:dummy");
-------------------------------------------------------------------------

To specify a template directly as a header the component should use
dynamically via a header, so for example:

[source,java]
------------------------------------------------------------------------------------------
from("direct:in").
  setHeader("CamelMvelTemplate").constant("@{\"The result is \" + request.body * 3}\" }").
  to("velocity:dummy");
------------------------------------------------------------------------------------------

[[MVELComponent-SeeAlso]]
See Also
^^^^^^^^

* link:configuring-camel.html[Configuring Camel]
* link:component.html[Component]
* link:endpoint.html[Endpoint]
* link:getting-started.html[Getting Started]

