...
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 consumeprocess
// 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);
}
}
|
...
Code Block |
---|
INFO: Exchange[BodyType:String, Body:Claus Ibsen]
|
Okay that isn't to impressive, Camel can log
Well I promised that the above code style can be used for any component, so let's store the payload in a file. We do this by adding the file component to the Camel context
Code Block |
---|
|
// add the file component
camel.addComponent("file", new FileComponent());
|
And then we let camel write the payload to the file after we have logged, by creating a new method sendToCamelFile. We want to store the payload in filename with the incident id so we need this parameter also:
Code Block |
---|
|
// let Camel do something with the name
sendToCamelLog(name);
sendToCamelFile(parameters.getIncidentId(), name);
|
And then the code that is 99% identical. We have change the URI configuration when we create the endpoint as we pass in configuration parameters to the file component.
And then we need to set the output filename and this is done by adding a special header to the exchange. That's the only difference:
Code Block |
---|
|
private void sendToCamelFile(String incidentId, String name) {
try {
// get the file component
Component component = camel.getComponent("file");
// create an endpoint and configure it.
// Notice the URI parameters this is a common pratice in Camel to configure
// endpoints based on URI.
// file://target instructs the base folder to output the files. We put in the target folder
// then its actumatically cleaned by mvn clean
Endpoint endpoint = component.createEndpoint("file://target");
// 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 a special header is set to instruct the file component what the output filename
// should be
exchange.getIn().setHeader(FileComponent.HEADER_FILE_NAME, "incident-" + incidentId + ".txt");
// 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 file component, that will process
// the exchange and yes write the payload to the given filename
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);
}
}
|
After running our unit test again with mvn test
we have a output file in the target folder:
Code Block |
---|
D:\demo\part-two>type target\incident-123.txt
Claus Ibsen
|