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