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