# RabbitMQ Tutorial Using Spring AMQP

This project implements each of the [6 RabbitMQ Tutorials][1] using Spring AMQP.

It is a CLI app that uses Spring Profiles to control its behavior.  Each tutorial is a trio of classes:
sender, receiver, and configuration.

[1]: https://www.rabbitmq.com/getstarted.html

## Prerequisites
These tutorials assume RabbitMQ is [installed](https://rabbitmq.com/download.html) and running
on `localhost` using the standard port (`5672`). In case you use
a different host, port or credentials, connections settings would require adjusting.

## Usage

These tutorials use Maven. To build them run

```
./mvnw clean package
```
The app uses Spring Profiles to control what tutorial it's running, and if it's a
Sender or Receiver. Choose which tutorial to run by using these profiles:

- {tut1|hello-world},{sender|receiver}
- {tut2|work-queues},{sender|receiver}
- {tut3|pub-sub|publish-subscribe},{sender|receiver}
- {tut4|routing},{sender|receiver}
- {tut5|topics},{sender|receiver}
- {tut6|rpc},{client|server}

After building with maven, run the app however you like to run boot apps.

For example:

```
java -jar target/rabbitmq-tutorials.jar --spring.profiles.active=work-queues,sender
```

will run the publisher part of tutorial 2 (Work Queues).

For tutorials 1-5, run the consumer (receiver) followed by the publisher (sender):

```
# shell 1
java -jar target/rabbitmq-tutorials.jar --spring.profiles.active=work-queues,receiver

# shell 2
java -jar target/rabbitmq-tutorials.jar --spring.profiles.active=work-queues,sender
```

For tutorial 6, run the server followed by the client.

You can find more usage instructions by running the following command:

```
java -jar target/rabbitmq-tutorials.jar
```

This will display the following message:

```
This app uses Spring Profiles to control its behavior.

Options are:
java -jar target/rabbitmq-tutorials.jar --spring.profiles.active=hello-world,receiver
java -jar target/rabbitmq-tutorials.jar --spring.profiles.active=hello-world,sender
java -jar target/rabbitmq-tutorials.jar --spring.profiles.active=work-queues,receiver
java -jar target/rabbitmq-tutorials.jar --spring.profiles.active=work-queues,sender
java -jar target/rabbitmq-tutorials.jar --spring.profiles.active=pub-sub,receiver
java -jar target/rabbitmq-tutorials.jar --spring.profiles.active=pub-sub,sender
java -jar target/rabbitmq-tutorials.jar --spring.profiles.active=routing,receiver
java -jar target/rabbitmq-tutorials.jar --spring.profiles.active=routing,sender
java -jar target/rabbitmq-tutorials.jar --spring.profiles.active=topics,receiver
java -jar target/rabbitmq-tutorials.jar --spring.profiles.active=topics,sender
java -jar target/rabbitmq-tutorials.jar --spring.profiles.active=rpc,client
java -jar target/rabbitmq-tutorials.jar --spring.profiles.active=rpc,server
```

## Configuration

When running receivers/servers it's useful to set the duration the app runs to a longer time.  Do this by setting
the `tutorial.client.duration` property.

```
java -jar target/rabbitmq-tutorials.jar --spring.profiles.active=tut2,receiver,remote --tutorial.client.duration=60000
```

By default, Spring AMQP uses localhost to connect to RabbitMQ.  In the
sample, the `remote` profile causes Spring to load the properties in
`application-remote.yml` that are used for testing with a non-local
server.  Set your own properties in the one in the project, or provide
your own on the command line when you run it.

To use to a remote RabbitMQ installation set the following properties:

```
spring:
  rabbitmq:
    host: <rabbitmq-server>
    username: <tutorial-user>
    password: <tutorial-user>
```

To use this at runtime create a file called `application-remote.yml` (or properties) and set the properties in there.  Then set the
remote profile as in the example above.  See the [Spring Boot](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/)
and [Spring AMQP documentation](https://docs.spring.io/spring-amqp/reference/html/) for more information on setting application
properties and AMQP properties specifically.