# RabbitMQ ## Общее `RabbitMQ` — это брокер сообщений, обеспечивающий обмен данными между различными частями системы по принципу "издатель-подписчик". Он позволяет приложениям отправлять и получать сообщения асинхронно. В приложении RabbitMQ используется для обмена сообщениями между модулями и уведомлений пользователя о событиях, таких как: - Создание новых задач; - Результаты фоновых процессов; - Трассировка операций; - Перехваты вызовов серверных методов; - Общие уведомления. ## Как реализовано взаимодействие с RabbitMQ ### Обмен сообщениями - Создаются exchange'ы (точки обмена) по пользователям: `btk.service.user..` ```{note} При запуске приложения по умолчанию создается точка обмена на пользователе ``` - Сообщения публикуются в exchange с указанием типа (type) и содержимого (body). ### Получение сообщений - Подписка на exchange выполняется методом startConsume(exchangeName) в `(Btk_RabbitLib)`. - Все входящие сообщения на текущий момент обрабатываются через onReceiveMessage(...), где по type определяется нужный обработчик: - Btk_AcTrace - Btk_BackgroundRun - Btk_ServerMethodIntercept - Прочие — обрабатываются через `Btk_Ept`. ### Удаление exchange Метод `deleteRabbitExchange` в `(Btk_RabbitPkg)` позволяет удалить ненужные точки обмена. ## Жизненный цикл подписки на сообщения - При запуске приложения: - В ApplicationAvi.onShow() вызывается Btk_ApplicationLib().onStartApplication(). - Это инициирует Btk_RabbitLib().onStartApplication(), которая автоматически подписывает пользователя на его exchange. - При завершении приложения: - Вызывается Btk_RabbitLib().onCloseApplication(), отписывая пользователя от exchange. ## Пример отправки сообщения по RabbitMQ ### Пример: Отправка сообщения от трассировки прав (Btk_AcTracePkg.createAcTraceMessageHandler) ```scala def createAcTraceMessageHandler( sid: NString, sUserCluster: NString, sFlag: NString, sUser: NString, sSidUser: NString, sUserClusterStarted: NString ): Unit = { try app { // Формируем JSON-объект val jObj = createAcTraceJsonObject(sid, sUserCluster, sFlag, sUser, sSidUser, sUserClusterStarted) val exchangeName = Btk_RabbitPkg().getServiceExchangeNameByUser(Btk_UserApi().getByMnemoCode(sUser).get.get(_.id)) // Отправляем сообщение в exchange с указанием типа "Btk_AcTrace" rabbitPkg.sendMessageWithType(jObj.toPrettyNString, TYPE_AC_TRACE, exchangeName) } catch { case e: AppException => throw e } } ``` ### Обобщенный способ отправки сообщения ```scala Btk_RabbitPkg().sendMessageWithType(messageText, messageType, exchangeName) ``` - messageText – JSON-строка с содержимым; - messageType – строка, идентифицирующая тип сообщения; - exchangeName – имя точки обмена, куда отправляется сообщение.