= Chunk Component
:doctitle: Chunk
:shortname: chunk
:artifactid: camel-chunk
:description: Transform messages using Chunk templating engine.
:since: 2.15
:supportlevel: Stable
:tabs-sync-option:
:component-header: Only producer is supported
//Manually maintained attributes
:camel-spring-boot-name: chunk

*Since Camel {since}*

*{component-header}*

The Chunk component allows for processing a message using a
https://github.com/tomj74/chunk-templates[Chunk] template.
This can be ideal when using Templating to
generate responses for requests.


== URI format

----------------------------
chunk:templateName[?options]
----------------------------

Where *templateName* is the classpath-local URI of the template to
invoke.

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


// component options: START
include::partial$component-configure-options.adoc[]
include::partial$component-endpoint-options.adoc[]
include::partial$component-endpoint-headers.adoc[]
// component options: END


Chunk component will look for a specific template in the _themes_ folder
with extensions _.chtml_ or _.cxml. _If you need to specify a different
folder or extensions, you will need to use the specific options listed
above.

== Usage

=== Chunk Context

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

 
[width="100%",cols="20%,80%",options="header",]
|=======================================================================
|key |value

|`exchange` |The `Exchange` itself.

|`exchange.properties` |The `Exchange` properties.

|`variables` |The variables

|`headers` |The headers of the In message.

|`camelContext` |The Camel Context.

|`request` |The In message.

|`body` |The In message body.

|`response` |The Out message (only for InOut message exchange pattern).
|=======================================================================

=== 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.

== Examples

For example, you could use something like:

[source,java]
--------------------------
from("activemq:My.Queue").
to("chunk:template");
--------------------------

To use a Chunk template to formulate a response for 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:

[source,java]
-----------------------------
from("activemq:My.Queue").
to("chunk:template").
to("activemq:Another.Queue");
-----------------------------

It's possible to specify what template the component should use
dynamically via a header, so for example:

[source,java]
------------------------------------------------------------------
from("direct:in").
setHeader(ChunkConstants.CHUNK_RESOURCE_URI).constant("template").
to("chunk:dummy?allowTemplateFromHeader=true");
------------------------------------------------------------------

An example of Chunk component options use:

[source,java]
---------------------------------------------------------------------------------------
from("direct:in").
to("chunk:file_example?themeFolder=template&themeSubfolder=subfolder&extension=chunk");
---------------------------------------------------------------------------------------

In this example, the Chunk component will look for the file
`file_example.chunk` in the folder `template/subfolder`.

=== The Email Example

In this sample, we want to use Chunk templating for an order confirmation email.
The email template is laid out in Chunk as:

[source,text]
----------------------------------------------
Dear {$headers.lastName}, {$headers.firstName}

Thanks for the order of {$headers.item}.

Regards Camel Riders Bookstore
{$body}
----------------------------------------------



include::spring-boot:partial$starter.adoc[]
