= Walk through an Example Code

This mini-guide takes you through the source code of a
https://github.com/apache/camel-examples/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-examples/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]
----
 CamelContext context = new DefaultCamelContext();
----

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]
----
context.addRoutes(new RouteBuilder() {
            public void configure() {
                from("test-jms:queue:test.queue").to("file://test");
            }
        });
----

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

[source,java]
----
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://localhost?broker.persistent=false");
        // Note we can explicit name the component
        context.addComponent("test-jms", JmsComponent.jmsComponentAutoAcknowledge(connectionFactory));
----

or explicitly using the Component DSL which allows you to configure the components using DSL APIs and register them to the camel context. First you will have the import the maven package for the Component DSL:
[source,xml]
------------------------------------------------------------
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-componentdsl</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>
------------------------------------------------------------

and the register the component like this:
[source,java]
----
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://localhost?broker.persistent=false");

ComponentsBuilderFactory.jms()
         .connectionFactory(connectionFactory)
         .acknowledgementMode(1)
         .register(context, "test-jms");
----

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]
----
ProducerTemplate template = context.createProducerTemplate();
----

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]
----
for (int i = 0; i < 10; i++) {
    template.sendBody("test-jms:queue:test.queue", "Test Message: " + i);
}
----

== 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.
