# Camel Example Spring Boot and ActiveMQ AMQP

This example shows how to work with a simple Apache Camel application using Spring Boot and Apache ActiveMQ.

## Preparing ActiveMQ brokers

From Apache ActiveMQ you can download the broker as a .zip or .tar.gz file.

Unzip/tar the archive, and start a terminal.

Change directory to the unzipped directory and start the broker.

    bin/activemq console

Which runs the broker in the foreground and logs to the console.

## How to run the example

You can run this example using

    mvn spring-boot:run

## Using Camel components

Apache Camel provides 200+ components which you can use to integrate and route messages between many systems
and data formats. To use any of these Camel components, add the component as a dependency to your project.

## More information

You can find more information about Apache Camel at the website: http://camel.apache.org/
