blob: e6348a58b39e1fbe427793cfd71df5c173b1f765 [file] [log] [blame]
[[ProducerTemplate-ProducerTemplate]]
=== ProducerTemplate
The ProducerTemplate interface allows you to send message exchanges to
endpoints in a variety of different ways to make it easy to work with
Camel link:endpoint.adoc[Endpoint] instances from Java code.
It can be configured with a default endpoint if you just want to send
lots of messages to the same endpoint; or you can specify an
link:endpoint.adoc[Endpoint] or uri as the first parameter.
The `sendBody()` method allows you to send any object to an endpoint
easily.
[source,java]
----
ProducerTemplate template = exchange.getContext().createProducerTemplate();
// send to default endpoint
template.sendBody("<hello>world!</hello>");
// send to a specific queue
template.sendBody("activemq:MyQueue", "<hello>world!</hello>");
// send with a body and header
template.sendBodyAndHeader("activemq:MyQueue",
"<hello>world!</hello>",
"CustomerRating", "Gold");
----
You can also supply an `Exchange` or a `Processor` to customize the exchange.
[[ProducerTemplate-requestmethods]]
==== `request*()` methods
The `send*()` methods use the default Message Exchange Pattern (InOnly,
InOut etc) as the endpoint. If you want to explicitly perform a
request/response (InOut) you can use the `request*()` methods instead of
the `send*()` methods.
E.g. let's invoke an endpoint and get the response:
[source,java]
----
Object response = template.requestBody("<hello/>");
// you can cast the response directly
String ret = template.requestBody("<hello/>", String.class);
// or specify the endpoint directly
String ret = template.requestBody("cxf:bean:HelloWorldService", "<hello/>", String.class);
----
[[ProducerTemplate-Fluentinterface]]
==== Fluent interface
*Available as of Camel 2.18.0*
The FluentProducerTemplate provides a fluent syntax to
ProducerTemplate.
Examples:
*Set headers and body*
[source,java]
----
Integer result = FluentProducerTemplate.on(context)
.withHeader("key-1", "value-1")
.withHeader("key-2", "value-2")
.withBody("Hello")
.to("direct:inout")
.request(Integer.class);
----
*Use a processor*
[source,java]
----
Integer result = FluentProducerTemplate.on(context)
.withProcessor(exchange -> exchange.getIn().setBody("Hello World"))
.to("direct:exception")
.request(Integer.class);
----
*Customize template*
[source,java]
----
Object result = FluentProducerTemplate.on(context)
.withTemplateCustomizer(
template -> {
template.setExecutorService(myExecutor);
template.setMaximumCacheSize(10);
}
)
.withBody("the body")
.to("direct:start")
.request();
 
----