Part 2
Adding Camel
In this part we will introduce Camel so we start by adding Camel to our pom.xml:
Code Block |
---|
|
<properties>
...
<camel-version>1.4.0</camel-version>
</properties>
<!-- camel -->
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-core</artifactId>
<version>${camel-version}</version>
</dependency>
|
That's it, only one dependency for now.
Tip |
---|
|
If you continue from part 1, remember to update your editor project settings since we have introduce new .jar files. For instance IDEA has a feature to synchronize with Maven projects. |
Now we turn towards our webservice endpoint implementation where we want to let Camel have a go at the input we receive. As Camel is very non invasive its basically a .jar file then we can just grap Camel but creating a new instance of DefaultCamelContext
that is the hearth of Camel its context.
Code Block |
---|
|
CamelContext camel = new DefaultCamelContext();
|
In fact we create a constructor in our webservice and add this code:
Code Block |
---|
|
private CamelContext camel;
public ReportIncidentEndpointImpl() throws Exception {
// create the camel context that is the "heart" of Camel
camel = new DefaultCamelContext();
// add the log component
camel.addComponent("log", new LogComponent());
// start Camel
camel.start();
}
|
Here at first we want Camel to log the givenName and familyName parameters we receive, so we add the LogComponent
with the key log. And we must start Camel before its ready to act.
Then we change the code in the method that is invoked by Apache CXF when a webservice request arrives. We get the name and let Camel have a go at it in the new method we create sendToCamel:
Code Block |
---|
|
public OutputReportIncident reportIncident(InputReportIncident parameters) {
String name = parameters.getGivenName() + " " + parameters.getFamilyName();
// let Camel do something with the name
sendToCamelLog(name);
OutputReportIncident out = new OutputReportIncident();
out.setCode("OK");
return out;
}
|
Next is the Camel code. At first it looks like there are many code lines to do a simple task of logging the name - yes it is. But later you will in fact realize this is one of Camels true power. Its concise API. Hint: The same code can be used for any component in Camel.
Code Block |
---|
|
private void sendToCamelLog(String name) {
try {
// get the log component
Component component = camel.getComponent("log");
// create an endpoint and configure it.
// Notice the URI parameters this is a common pratice in Camel to configure
// endpoints based on URI.
// com.mycompany.part2 = the log category used. Will log at INFO level as default
Endpoint endpoint = component.createEndpoint("log:com.mycompany.part2");
// create an Exchange that we want to send to the endpoint
Exchange exchange = endpoint.createExchange();
// set the in message payload (=body) with the name parameter
exchange.getIn().setBody(name);
// now we want to send the exchange to this endpoint and we then need a producer
// for this, so we create and start the producer.
Producer producer = endpoint.createProducer();
producer.start();
// process the exchange will send the exchange to the log component, that will consume
// the exchange and yes log the payload
producer.process(exchange);
// stop the producer, we want to be nice and cleanup
producer.stop();
} catch (Exception e) {
// we ignore any exceptions and just rethrow as runtime
throw new RuntimeException(e);
}
}
|
Okay there are code comments in the code block above that should explain what is happening. We run the code by invoking our unit test with maven mvn test
, and we should get this log line:
Code Block |
---|
INFO: Exchange[BodyType:String, Body:Claus Ibsen]
|