Перейти к основному содержанию
`Ctrl`+`K`

# RabbitMQ

## Общее

`RabbitMQ` — это брокер сообщений, обеспечивающий обмен данными между различными частями системы по принципу «издатель-подписчик». Он позволяет приложениям отправлять и получать сообщения асинхронно.

В приложении RabbitMQ используется для обмена сообщениями между модулями и уведомлений пользователя о событиях, таких как:

- Создание новых задач.

- Результаты фоновых процессов.

- Трассировка операций.

- Перехваты вызовов серверных методов.

- Общие уведомления.

## Как реализовано взаимодействие с RabbitMQ

### Обмен сообщениями

- Создаются exchange’ы (точки обмена) по пользователям: `btk.service.user.<userID>.`

  Примечание

  При запуске приложения по умолчанию создается точка обмена на пользователе

- Сообщения публикуются в 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)

    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
        }
      }

### Обобщенный способ отправки сообщения

    Btk_RabbitPkg().sendMessageWithType(messageText, messageType, exchangeName)

- `messageText` – JSON-строка с содержимым;

- `messageType` – строка, идентифицирующая тип сообщения;

- `exchangeName` – имя точки обмена, куда отправляется сообщение.