## Пример взаимодействия приложений через RabbitMQ

В примере демонстрируется:
* *использование `@Scheduled` таймера для имитации пользовательской активности*   
* *оправка и прием сообщений между двумя приложениями через RabbitMQ*   
* *создание и отправка email сообщений средствами SpringMail*
* *аггрегация данных с помощью SpringData/JPQL*
* *создание кастомного endpoint-а actuator-а для вывода статистики*

Описание примера:

user-activity-emitter-microservice:
* *по таймеру `UserActivityEmitterService` достает из БД случайный тип активности и пользователя*   
* *после чего формирует из них объект активности (`UserActivity`) и отправляет в очередь сообщений RabbitMQ с помощью `RabbitTemplate` настроенный на работу с "main-exchange"*
* *большее число активностей имеют `routingKey` = "user.activity.message.simple" *
* *активности, у которых в названии типа есть вхождение "Вредн" имееют свой `routingKey` ("user.activity.message.important") *
* *так же приложение по таймеру, с помощью `ActivityStatCalculationEmitterSerivce` инициирует подсчет статистики с помощью отправки сообщения в очередь RabbitMQ c `routingKey` = "user.activity.stat"*

user-activity-processor-microservice:
* *в приложении для обработки сообщений есть несколько очередей, куда попадают сообщения в зависимости от `routingKey`*
* *их прослушивает компонент `RabbitMqListener`, который содержит по методу на каждую очередь"*
* *в "all-activity-queue" попадают все активности. На выходе из данной очереди активности сохраняются в БД* 
* *в "important-activity-queue" попадают важные активности. На выходе из данной очереди активности преобразуются в письма и отправляются на почту администратору* 
* *в "stat-calc-commands-queue" попадают команды, которые инициируют расчет статистики. * 
* *в методе-обработчике сообщений данной очереди происходит удаление старых статистических данных, а так же подсчет и сохранение в БД новых*
* *за вывод статистических данных отвечает кастомный endpoint actuator-а `ActivityStatEndpoint`*


Для работы приложений требуется работающий RabbitMQ. За его запуск отвечает docker-compose.yml
Адрес консоли RabbitMQ: http://localhost:15672/
Логин и пароль: guest