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