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 – имя точки обмена, куда отправляется сообщение.