Thursday, September 24, 2009

Camellos - Discovering Apache Camel II

As indicated in my last blog post, here is an example implementing a small Apache Camel example.

You can pick up the source code from:
Steps to get it running:
  1. Check out the source
  2. Using Maven run: mvn camel:run
  3. The Application should compile and start up correctly.
  4. You can now drop files into the camellos/inbox directory
  5. The files should get uploaded to its the FTP server running at localhost:3333
  6. The uploaded files should show up under camellos/ftp
Back to y example, for my little blog post example here I want to provide the following very simplistic functionality:
  1. pick up files from an directory
  2. make sure that you pick up no more than 3 files per 30 seconds
  3. store them into a JMS queue
  4. have a listener on that queue that picks up those files
  5. and upload files to a remote FTP site
What do you think, how many lines of Java code does it take?

With Apache Camel you can get this simple task done with ZERO lines of Java code. Well, I needed 1 Main class with a few lines of code to load the Spring context and and the embedded FTP server. Nevertheless, I think that is quite impressive. In a sense all the heavy lifting is done in the Spring Application Context file:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns=""

<amq:broker useJmx="false" persistent="false">
<amq:transportConnector uri="tcp://localhost:0" />

<bean id="activemq" class="org.apache.activemq.camel.component.ActiveMQComponent">
<property name="brokerURL" value="vm://localhost"/>

<ftpserver:server id="ftpServer" max-logins="10"
anon-enabled="true" max-anon-logins="5" max-login-failures="3"
<ftpserver:nio-listener name="default" port="3333" local-address="localhost"/>
<ftpserver:file-user-manager file="" encrypt-passwords="clear" />

<camel:camelContext shouldStartContext="true" trace="true">
<camel:route id="route1">
<camel:from uri="file:camellos/inbox?move=.done" />
<camel:throttle maximumRequestsPerPeriod="1" timePeriodMillis="10000" >
<camel:to uri="activemq:queue:camellos"/>
<camel:route id="route2">
<camel:from uri="activemq:queue:camellos" />
<camel:to uri="ftp://admin@localhost:3333?password=secret"/>\

Apache Camel provides its own Maven plugin:

Getting started with Apache Camel is simple. I recommend using m2Eclipse which is a Maven plugin for Eclipse. Basically Camel provides it's own Maven archetype which after running creates a simple project structure and which can be immediately run using mvn camel:run after project creation.

For my implementation I followed Camel's tutorial for creating a Spring based Camel route.
As my example uses a few more components for Apache Camel but also ActiveMQ for JMS and Apache Mina FTP Server, I needed some additional Maven dependencies.

Getting all the Maven dependencies right took actually longer than implementing the actual application logic. Anyway, I hope this gives you a quick overview of some basic Apache Camel features. As time permits I will blog about more about it soon. See you then!

PS: Apache Mina FtpServer, is itself a nice little nifty package. So if you for example have the need to boot-up dynamically FTP servers from within your application...check it out.


Claus Ibsen said...

Gunnar fantastic work.

I have added link to your blogs on the Camel articles webpage. I hope you do not mind.
( takes a couple of hours to get updated. )

I do think that the Main class could be omitted as you can start using the camel:run maven plugin, or many also starts using jetty:run. And the FTP server couple possibly be started using some spring bean ninja. But anyway really cool that 0 lines of Java code can do all that.

Keep up the good work.

Gunnar Hillert said...

Hi Claus,

Thanks so much for your comments and adding a link to my blog. I am really impressed with Camel so far - Great work!! If you know anybody from the Camel team that likes to present at AJUG, in Atlanta, let me know. People need to know more about it :-)

devylon said...

i had to change the pom.xml a little bit. should be the fqn class name:
mainClass: com.hillert.camellos.Main

-- devylon

Marcelo Jabali said...

Very nice tutorial... I also had to change the Main class name in the pom file but other than that very nice work.

David Roussel said...

Neat example, and thanks for providing an SVN repo for the example source. I did a checkout and ran the example. Very neat.

Anonymous said...

Thank you, Gunnar!
Your example was really helpful form me!