Команда PRODUCE
- Регистр сведений исходящих сообщений
- Базовый пример публикации сообщений
- Пользовательские заголовки сообщений
- Формирование заголовков в коде DaJet Script
PRODUCE 'amqp://<username>:<password>@<server>:<port>/<virtual-host>'
SELECT <options>
<username> - имя пользователя
<password> - пароль пользователя
<server> - адрес сервера RabbitMQ
<port> - порт сервера RabbitMQ
<virtual-host> - виртуальный хост сервера RabbitMQ
<options> - свойства сообщения RabbitMQ (смотри ниже)
Строка подключения к брокеру RabbitMQ указывается в формате URL, следовательно, все специфические символы, например в пароле пользователя, должны быть указаны в URL-кодировке.
Таблица свойств публикуемого сообщения RabbitMQ
Свойство | Тип данных | Описание |
---|---|---|
AppId | string | Наименование отправителя |
Exchange | string | Наименование топика для публикации сообщения |
RoutingKey | string | Ключ маршрутизации, если свойство Exchange заполнено. В противном случае - наименование очереди для прямой отправки без маршрутизации. |
Mandatory | number | Признак обязательности наличия очереди назначения. Подробнее смотри документацию RabbitMQ. По умолчанию DaJet Script не использует этот флаг. |
MessageId | string | Идентификатор сообщения |
Type | string | Тип сообщения |
Body | string | Тело сообщения: DaJet Script ориентируется на текстовые сообщения в кодировке UTF-8. |
BlindCopy | string (csv) |
Дополнительные ключи маршрутизации, разделённые запятой. Значения ключей не доставляются получателю. Документация RabbitMQ |
CarbonCopy | string (csv) |
Дополнительные ключи маршрутизации, разделённые запятой. Значения ключей доставляются получателю. Использовать не рекомендуется (оптимизация трафика). |
ContentType | string | Тип содержимого тела сообщения. Значение по умолчанию: application/json |
ContentEncoding | string | Формат (кодировка) тела сообщения. Значение по умолчанию: UTF-8 |
DeliveryMode | number | Вид доставки: 1 - in-memory, 2 - persistent. Значение по умолчанию: 2 (сохранение на диск) |
Priority | number | Приоритет доставки сообщения от 0 до 9 Значение по умолчанию: 0 (ноль) |
ReplyTo | string | Адресат для обратной связи, определяемый логикой приложения. |
CorrelationId | string | Идентификатор корреляции сообщений между собой, определяемый логикой приложения. |
Expiration | string | Спецификация устаревания сообщения. Подробнее смотри документацию RabbitMQ. По умолчанию не используется. |
Headers | object | Пользовательские заголовки (смотри документацию ниже) |
Регистр сведений исходящих сообщений
Для ниже следующих примеров используется независимый и непериодический регистр сведений “ИсходящиеСообщения”:
Реквизит | Назначение | Тип данных | Описание |
---|---|---|---|
НомерСообщения | Измерение | ЧИСЛО(15,0) | Номер сообщения |
Заголовки | Ресурс | СТРОКА(1024) | Заголовки сообщения |
ТипСообщения | Ресурс | СТРОКА(1024) | Тип сообщения |
ТелоСообщения | Ресурс | СТРОКА(0) | Тело сообщения |
Получатель | Реквизит | СТРОКА(36) | Код получателя |
Базовый пример публикации сообщений
DECLARE @message object
USE 'mssql://server/database'
CONSUME TOP 1000
Получатель
, НомерСообщения
, ТипСообщения
, ТелоСообщения
INTO @message
FROM РегистрСведений.ИсходящиеСообщения
ORDER BY НомерСообщения ASC
PRODUCE 'amqp://guest:guest@localhost:5672/dajet'
SELECT AppId = 'Центральный офис'
, Exchange = 'test-exchange'
, RoutingKey = @message.Получатель
, MessageId = @message.НомерСообщения
, Type = @message.ТипСообщения
, Body = @message.ТелоСообщения
END
Пользовательские заголовки сообщений
Пользовательские заголовки - это своего рода метаданные о сообщении. Их полезно использовать для указания дополнительных сведений, например, о версии формата JSON в теле сообщения. Заголовки используются для быстрого получения информации о том как обработать или маршрутизировать сообщение. Таким образом отпадает необходимость парсинга всего тела сообщения, которое может быть большим, и оптимизируется обмен данными.
Команда PRODUCE позволяет работать с пользовательскими заголовками сообщений RabbitMQ. В следующем примере заголовки хранятся в формате JSON в исходящей очереди регистра сведений. Чтобы их отправить в очередь RabbitMQ, необходимо эти заголовки десериализовать при помощи функции JSON в объект типа object
, а затем присвоить полученное значение свойству Headers
сообщения RabbitMQ.
DECLARE @message object
USE 'mssql://server/database'
CONSUME TOP 1000
Получатель
, Заголовки
, НомерСообщения
, ТипСообщения
, ТелоСообщения
INTO @message
FROM РегистрСведений.ИсходящиеСообщения
ORDER BY НомерСообщения ASC
PRODUCE 'amqp://guest:guest@localhost:5672/dajet'
SELECT AppId = 'Центральный офис'
, Exchange = 'test-exchange'
, Headers = JSON(@message.Заголовки)
, RoutingKey = @message.Получатель
, MessageId = @message.НомерСообщения
, Type = @message.ТипСообщения
, Body = @message.ТелоСообщения
END
Формирование заголовков в коде DaJet Script
DECLARE @message object
DECLARE @headers object
USE 'mssql://server/database'
CONSUME TOP 1000
Получатель
, НомерСообщения
, ТипСообщения
, ТелоСообщения
INTO @message
FROM РегистрСведений.ИсходящиеСообщения
ORDER BY НомерСообщения ASC
-- Формирование пользовательских заголовков
SET @headers = SELECT version = '1.0'
PRODUCE 'amqp://guest:guest@localhost:5672/dajet'
SELECT AppId = 'Центральный офис'
, Exchange = 'test-exchange'
, Headers = @headers -- Заголовки
, RoutingKey = @message.Получатель
, MessageId = @message.НомерСообщения
, Type = @message.ТипСообщения
, Body = @message.ТелоСообщения
END