This tutorial shows how to perform a simple transformation from CSV to Java objects with Camel using as destination a processor or a JMS Queue.
First of all, we will define a class mapping our CSV file.
package com.sample.model; import java.io.Serializable; import org.apache.camel.dataformat.bindy.annotation.CsvRecord; import org.apache.camel.dataformat.bindy.annotation.DataField; @CsvRecord(separator = ",") public class User implements Serializable { @DataField(pos = 1) private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSurname() { return surname; } public void setSurname(String surname) { this.surname = surname; } @DataField(pos = 2) private String surname; @Override public String toString() { return "User [name=" + name + ", surname=" + surname + "]"; } }
As you can see, this class is annotated with a @CsvRecord that defines the separator to be used in the CSV file, and the list of fields in the CSV file, with its position. Here is for example a single row CSV we will use:
john,smith
And now the Route Builder class:
import org.apache.camel.CamelContext; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.dataformat.bindy.csv.BindyCsvDataFormat; import org.apache.camel.impl.DefaultCamelContext; import org.apache.camel.spi.DataFormat; public class Hello { public static void main(String args[]) throws Exception { CamelContext context = new DefaultCamelContext(); final DataFormat bindy = new BindyCsvDataFormat("com.sample.model"); context.addRoutes(new RouteBuilder() { public void configure() { from("file:C:\\camel\\in?noop=true"). unmarshal(bindy) .process(new SimpleProcessor()); } }); context.start(); Thread.sleep(10000); context.stop(); } }
As you can see this class, scans for CSV files contained in the folder C:\Camel\In, unmarshalls them using the BindyCsvDataFormat and produces Java Objects of type com.sample.model.User to the SimpleProcessor. Here is a basic implementation for SimpleProcessor which merely prints out the com.sample.model.User:
import java.util.ArrayList; import java.util.HashMap; import org.apache.camel.Exchange; import org.apache.camel.Processor; import com.sample.model.User; public class SimpleProcessor implements Processor { public void process(Exchange exchange) throws Exception { ArrayList<HashMap<String, Object>> list = (ArrayList) exchange.getIn() .getBody(); for (HashMap<String, Object> map : list) { for (String key : map.keySet()) { System.out.println("key : " + key); User user = (User) map.get(key); System.out.println("value : " + user); } } } }
The objects are collected by the processor as HashMap of key/values contained in an ArrayList.
Creating a JMS endpoint
Let’s write now a more complex implementation which used an ActiveMQ destination for our objects:
import javax.jms.ConnectionFactory; import org.apache.activemq.ActiveMQConnection; import org.apache.activemq.ActiveMQConnectionFactory; import org.apache.camel.CamelContext; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.jms.JmsComponent; import org.apache.camel.dataformat.bindy.csv.BindyCsvDataFormat; import org.apache.camel.impl.DefaultCamelContext; import org.apache.camel.spi.DataFormat; public class HelloJMS { public static void main(String args[]) throws Exception { CamelContext context = new DefaultCamelContext(); final DataFormat bindy = new BindyCsvDataFormat("com.sample.model"); ConnectionFactory connectionFactory = new ActiveMQConnectionFactory( "admin", "admin", ActiveMQConnection.DEFAULT_BROKER_URL); context.addComponent("test-jms", JmsComponent.jmsComponentAutoAcknowledge(connectionFactory)); context.addRoutes(new RouteBuilder() { public void configure() { from("file:C:\\camel\\in?noop=true"). unmarshal(bindy) .to("test-jms:queue:testMQDestination"); } }); context.start(); Thread.sleep(10000); context.stop(); } }
This example relies on the default TCP broker URL for ActiveMQ (tcp://hostname:61616). Provided that the User class is available in ActiveMQ classpath (pack the classes in a JAR file and include them in the lib folder of ActiveMQ), you will be able to see the Object in the Message Details of ActiveMQ console: