Spring Boot Apache Camel ProducerTemplate Example
1. Overview
When working with Spring Boot Apache Camel ProducerTemplate, you gain a powerful way to send messages programmatically into Camel routes without needing to trigger them through external events like HTTP requests or timers. The ProducerTemplate is a simple yet flexible API that lets you inject messages directly into the Camel context, enabling custom integrations, dynamic routing, and programmatic testing of message flows.
Apache Camel, as a rule, excels in building integration solutions thanks to its huge library of components, Enterprise Integration Patterns (EIPs), and routing capabilities. Spring Boot makes configuring and running Camel applications much simpler by handling dependency management, auto-configuration, and application lifecycle.
In this guide, we will explore:
- What
ProducerTemplateis and why it’s useful. - How to set up the Maven dependencies.
- How to create a Camel route in a Spring Boot application.
- How to call it programmatically using a controller and tests.
By the end, you’ll have a working example of using Spring Boot Apache Camel ProducerTemplate to send data into your routes from anywhere in your application.
2. Understanding ProducerTemplate
The ProducerTemplate in Apache Camel is a helper object that allows you to send messages to endpoints programmatically. Think of it as a direct programmatic producer for your Camel routes.
Key characteristics:
- Direct Endpoint Access: You can send messages to any Camel endpoint URI, such as
direct:routeName,seda:queueName,jms:queue, etc. - Flexible Message Types: It supports sending plain strings, objects, or even custom exchange patterns.
- Request-Reply or Fire-and-Forget: You can either wait for a response (
requestBody) or send a message without expecting a reply (sendBody).
Typical usage scenario: You might have a REST endpoint in your Spring Boot application that, when triggered, needs to feed data into a Camel route for processing. Instead of manually building an Exchange object, you can simply call producerTemplate.sendBody().
Example conceptual flow:
[REST Controller] --> ProducerTemplate --> [Camel Route] --> [Target System]
This mechanism decouples message production from routing logic, keeping your application modular and testable.
3. Maven Dependencies
To use Spring Boot Apache Camel ProducerTemplate, you need the proper Maven dependencies.
pom.xml
<dependencies>
<!-- Spring Boot Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- Apache Camel Spring Boot Starter -->
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-spring-boot-starter</artifactId>
<version>4.4.0</version>
</dependency>
<!-- For REST DSL (optional, if using REST routes) -->
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-rest-starter</artifactId>
</dependency>
<!-- Testing support -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
The key dependency here is camel-spring-boot-starter, which auto-configures the Camel context and registers ProducerTemplate as a Spring bean.
4. Creating a Route
Now let’s create a simple Camel route that receives messages from a direct: endpoint and processes them.
MyCamelRoute.java
import org.apache.camel.builder.RouteBuilder;
import org.springframework.stereotype.Component;
@Component
public class MyCamelRoute extends RouteBuilder {
@Override
public void configure() {
from("direct:startRoute")
.log("Received message: ${body}")
.transform(simple("Processed: ${body}"))
.to("mock:result"); // Replace with actual endpoint in real projects
}
}
How it works:
from("direct:startRoute"): The route starts from adirectendpoint namedstartRoute. This is ideal for internal communication..log(...): Logs the message body..transform(...): Modifies the message by prepending “Processed:”..to("mock:result"): Sends the result to a mock endpoint (helpful for testing). You can replace this withfile:,jms:, or any Camel component URI.
This route is now ready to receive messages via Spring Boot Apache Camel ProducerTemplate.
5. Controller and Test Classes
5.1 Creating a Controller to Trigger the Route
We will create a REST controller that accepts an HTTP request and uses the ProducerTemplate to send the request body to our Camel route.
MyController.java
import org.apache.camel.ProducerTemplate;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api")
public class MyController {
private final ProducerTemplate producerTemplate;
public MyController(ProducerTemplate producerTemplate) {
this.producerTemplate = producerTemplate;
}
@PostMapping("/process")
public String processMessage(@RequestBody String message) {
// Send message and expect a reply
return producerTemplate.requestBody("direct:startRoute", message, String.class);
}
}
Explanation:
- Dependency Injection: The
ProducerTemplateis auto-wired by Spring Boot thanks to Camel’s Spring Boot starter. - requestBody: Sends the incoming HTTP body to
direct:startRouteand waits for the transformed response. - This creates a bridge between HTTP clients and Camel routes without directly coupling them.
5.2 Testing the ProducerTemplate with Spring Boot
We can write a simple integration test to verify that our ProducerTemplate and route work together.
MyControllerTest.java
import org.apache.camel.ProducerTemplate;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import static org.assertj.core.api.Assertions.assertThat;
@SpringBootTest
class MyControllerTest {
@Autowired
private ProducerTemplate producerTemplate;
@Test
void testProducerTemplateRoute() {
String input = "Hello Camel";
String result = producerTemplate.requestBody("direct:startRoute", input, String.class);
assertThat(result).isEqualTo("Processed: Hello Camel");
}
}
This test directly uses the ProducerTemplate in the test context, bypassing the HTTP layer. This is one of the reasons why Spring Boot Apache Camel ProducerTemplate is so useful — you can easily test route logic in isolation.
6. Conclusion
Using Spring Boot Apache Camel ProducerTemplate allows you to integrate Camel routes seamlessly with your application’s business logic. Whether you need to send messages from a REST endpoint, a scheduled job, or another service layer, ProducerTemplate offers a clean and efficient API.
In this article, we covered:
- What
ProducerTemplateis and how it works in Apache Camel. - Setting up Maven dependencies for a Spring Boot project with Camel.
- Building a simple Camel route.
- Using a REST controller to send messages to the route.
- Testing your route logic with
ProducerTemplate.
This pattern is especially powerful when you need fine-grained control over when and how messages enter your Camel routes. Combined with Spring Boot’s simplicity and Camel’s integration power, it forms a solid foundation for scalable, maintainable, and testable integration solutions.
If you’re working on a larger integration project, you can extend this example by:
- Adding more routes with different endpoints (
seda:,jms:,file:). - Handling exceptions with Camel’s
onExceptionDSL. - Using typed messages or complex objects as the payload.
Mastering Spring Boot Apache Camel ProducerTemplate will make your integration code cleaner and give you more flexibility in designing robust message-driven applications.




