= Walk through an Example Code

This mini-guide takes you through the source code of a
https://github.com/apache/camel/blob/master/examples/camel-example-jms-file/src/main/java/org/apache/camel/example/jmstofile/CamelJmsToFileExample.java[simple
example].

Camel can be configured either by using xref:spring.adoc[Spring] or
directly in Java - which
https://github.com/apache/camel/blob/master/examples/camel-example-jms-file/src/main/java/org/apache/camel/example/jmstofile/CamelJmsToFileExample.java[this
example does].

We start with creating a xref:camelcontext.adoc[CamelContext] - which is
a container for xref:components::index.adoc[Components],
xref:routes.adoc[Routes]
etc:

[source,java]
----
include::{examplesdir}/examples/camel-example-jms-file/src/main/java/org/apache/camel/example/jmstofile/CamelJmsToFileExample.java[tags=e1]
----

There is more than one way of adding a Component to the CamelContext. You can
add components implicitly - when we set up the routing - as we do here
for the
xref:components::file-component.adoc[FileComponent]:

[source,java]
----
include::{examplesdir}/examples/camel-example-jms-file/src/main/java/org/apache/camel/example/jmstofile/CamelJmsToFileExample.java[tags=e3]
----

or explicitly - as we do here when we add the JMS Component:

[source,java]
----
include::{examplesdir}/examples/camel-example-jms-file/src/main/java/org/apache/camel/example/jmstofile/CamelJmsToFileExample.java[tags=e2]
----

The above works with any JMS provider. If we know we are using
xref:components::activemq-component.adoc[ActiveMQ] we can use an even simpler form using the
http://activemq.apache.org/maven/5.5.0/activemq-camel/apidocs/org/apache/activemq/camel/component/ActiveMQComponent.html#activeMQComponent%28java.lang.String%29[`activeMQComponent()`
method] while specifying the
http://activemq.apache.org/configuring-transports.html[brokerURL] used
to connect to ActiveMQ

In normal use, an external system would be firing messages or events
directly into Camel through one if its xref:components::index.adoc[Components]
but we are going to use tha xref:producertemplate.adoc[ProducerTemplate]
which is a really easy way for testing your
configuration:

[source,java]
----
include::{examplesdir}/examples/camel-example-jms-file/src/main/java/org/apache/camel/example/jmstofile/CamelJmsToFileExample.java[tags=e4]
----

Next you *must* start the camel context. If you are using
xref:spring.adoc[Spring] to configure the camel context this is
automatically done for you; though if you are using a pure Java approach
then you just need to call the start() method

[source,java]
----
camelContext.start();
----

This will start all of the configured routing rules.

So after starting the xref:camelcontext.adoc[CamelContext], we can fire
some objects into
camel:

[source,java]
----
include::{examplesdir}/examples/camel-example-jms-file/src/main/java/org/apache/camel/example/jmstofile/CamelJmsToFileExample.java[tags=e5]
----

== What happens?

From the
xref:producertemplate.adoc[ProducerTemplate]
- we send objects (in this case text) into the
xref:camelcontext.adoc[CamelContext] to the Component
_test-jms:queue:test.queue_. These text objects will be
xref:type-converter.adoc[converted automatically] into JMS Messages and
posted to a JMS Queue named _test.queue_. When we set up the
xref:routes.adoc[Route], we configured the
xref:components::file-component.adoc[FileComponent] to listen off the _test.queue_.

The File xref:components::file-component.adoc[FileComponent] will take messages off the
Queue, and save them to a directory named _test_. Every message will be
saved in a file that corresponds to its destination and message id.

Finally, we configured our own listener in the xref:routes.adoc[Route] -
to take notifications from the xref:components::file-component.adoc[FileComponent] and print
them out as text.

*That's it!*

If you have the time then use 5 more minutes to
xref:walk-through-another-example.adoc[Walk through another example]
that demonstrates the Spring DSL (XML based) routing.
