Транспортный формат 4.0#

Транспортный формат 4.0 – это формат передачи векторов изменений между технологическими сервисами платформы.

Внимание!

В примерах описаны структуры JSON-документов каждого элемента, значения полей в этих примерах даны для ознакомления и не должны использоваться в исходном виде.

Контейнер#

Контейнер содержит служебную информацию об отправителе, транзакции, заголовках отправителя и массив с данными для принимающей системы.

Пример контейнера:

{
  "type": "hibernate-se",
  "txId": "fc66d610-944d-4f85-8188-18441764d508",
  "headers": {
    "txTimestamp": 904000000,
    "rootClass": "com.sbt.pprb.integration.tests.standin.entity.Owner",
    "rootId": "e873ec23-5177-4794-b7ce-9c1a27416013",
    "rootVersion": 0,
    "headerName": "header value"
  },
  "partitions": [
    {
      "type": "ORM_CV",
      "payload": <content>
    }
  ]
}

Список Атрибутов:

Поле

Тип

Описание

Принимаемое значение

Функциональность

type

string

Тип контейнера

Название системы, формирующей векторы изменений

Позволяет определить систему отправителя, тип контейнера и наличие специфичных для отправителя заголовков

txId

string

Идентификатор физической транзакции в БД

Любое

Уникальный идентификатор транзакции. Как правило, заполняется случайным UUID

headers

object

Дополнительные заголовки

Объект с произвольными атрибутами

Элемент headers может содержать произвольные значения, специфичные для системы отправителя и системы получателя.

txTimestamp

number

Отметка времени коммита транзакции

Любое

Заполняется как timestamp - количество миллисекунд, прошедших с отметки времени January 1, 1970, 00:00:00 GMT

rootClass

string

Имя корневой сущности

Любое

Заполняется при использовании глобального версионирования. Как правило, это full qualified class name. Подробнее об этом в примечаниии

rootId

string

Идентификатор корневой сущности

Любое

Заполняется при использовании глобального версионирования. Более подробная информация приведена в примечаниях

rootVersion

number

Версия корневой сущности

Любое

Монотонно возрастающая последовательность, изменяющаяся с каждым обновлением в БД любой сущности, входящей в агрегат. Заполняется при использовании глобального версионирования. Более подробная информация приведена в примечаниях

pertitions

array

Список партиций, содержащих данные

-

Более подробная информация приведена в описании атрибутов элемента списка partitions

Описание атрибутов элемента списка partitions:

Атрибут

Тип

Описание

Принимаемое значение

Комментарий

type

string

Тип партиции

ORM_CV | другое

Короткий идентификатор, по которому можно определить семантику данных в партиции. Тип партиции для передачи вектора изменений - ORM_CV. Так как данный документ описывает передачу векторов изменений, описание других типов партиций не приводится

payload

string

Данные партиции

ORM_CV | другое

Подобнее об этом в разделе «Тип ORM_CV»

Примечание

Тип и контент элементов списка partitions могут быть любого формата при условии, что читающая система способна разобрать этот формат. Для передачи векторов изменений должен использоваться тип ORM_CV и формат, описанный ниже.

Для обеспечения правильного порядка обработки изменений информация об изменениях включает номер версии объекта.

Подходы к версионированию:

  • Версионирование сущностей: у каждой сущности есть собственная версия. В этом случае заголовки rootId, rootVersion и rootClass необязательны, а в каждом событии изменения обязательно заполняются атрибуты version и previousVersion для события обновления. При каждом изменении сущности ее версия должна быть поднята на 1. В событиях обновления должна быть указана предыдущая версия этой сущности и новая версия. Читающие системы проверяют соответствие предыдущей версии сущности с той версией сущности, которая была обработана в последний раз. Если эти версии не совпадают, вектор отбрасывается как ошибочный.

  • Глобальное версионирование: версия есть только у корневого объекта в иерархии. Любое изменение как корневого, так и дочернего объекта изменяет версию корневого объекта. При любом изменении версия корневого объекта должна подниматься на 1. В этом случае заполняются атрибуты rootId (идентификатор корневого объекта), rootClass (класс корневого объекта) и rootVersion (новая версия корневого объекта). Поля version и previousVersion в векторах изменений не обязательны к заполнению. Читающая система перед обработкой вектора проверяет, что текущая версия корневого объекта на 1 меньше, чем значение rootVersion, и после обработки вектора устанавливает версию корневого объекта в значение, переданное в rootVersion. Допускается только одна корневая сущность в векторе изменений. Изменение корневой сущности для уже существующих объектов не допускается. После создания сущности она всегда должна передаваться вместе с той корневой сущностью, с которой была создана.

Пользователь отвечает за согласованность версий и передачу векторов изменений в том порядке, в котором версии останутся согласованными.

Тип ORM_CV#

Содержит информацию о сериализаторе и сериализованный вектор изменений.

Пример ORM_CV-контента:

{
  "serializerInfo": {
    "id": "3375153340802439707",
    "name": "json_gson",
    "format": "JSON"
  },
  "data": //вектор изменений
}

Список атрибутов:

Поле

Тип

Описание

Принимаемое значение

Комментарий

serializerInfo

object

Информация об используемом сериализаторе

serializerInfo

Подробнее об этом в описании полей элемента serializerInfo под таблицей

data

object

Сериализованные данные

JSON / строка

Подробнее об этом в примечании, следующем за описанием полей serializerInfo

Описание полей serializerInfo

Поле

Тип

Описание

Принимаемое значение

Комментарий

id

string

Идентификатор сериализатора

Любое

Заполняется только автоматически. Подробнее об этом в примечании под таблицей

name

string

Имя сериализатора

Любое

Заполняется только автоматически. Подробнее об этом в примечании под таблицей

format

string

Формат данных

JSON | BASE64

Значение JSON указывает на то, что вектор изменений передается в json формате.
BASE64 - вектор изменений передается в двоичном формате, кодированном в base64

Примечание

При использовании библиотеки HibernateSE поля id и name заполняются автоматически. Если эти поля не заполнены, поле format может принять только JSON-формат значение.

При формировании вектора без использования HibernateSE допустим только JSON-формат, при этом поля id и name не заполняются.

Вектор изменений#

Содержит список изменений сущностей, произошедших в транзакции.

Пример вектора изменений:

{
  "type" : "DELTA",
  "changeSets": [
    {
      "createEvents": [
        <события создания>
      ],
      "updateEvents": [
        <события обновления>
      ],
      "deleteEvents": [
        <события удаления>
      ]
    }
  ]
}

Список атрибутов:

Поле

Тип

Описание

Принимаемое значение

Комментарий

type

string

Тип вектора изменений

DELTA | SNAPSHOT

Указывает на подход к формированию вектора изменений.
DELTA - вектор изменений содержит значения только измененных полей.
SNAPSHOT - вектор содержит полное состояние сущности и включает в себя значения всех полей сущности.

changeSets

array

Список наборов изменений

-

Набор изменений представляет собой серию операций с сущностями, соответствующих одной операции сброса данных в БД (вызов flush() в терминах JPA). Более подробная информация приведена в описании полей списка changeSets

Описание полей списка changeSets

Поле

Тип

Описание

Принимаемое значение

Комментарий

createEvent

array

Список событий создания сущности

-

Событие создания сущности описывает операцию вставки записи в БД.
Подробнее об этом в разделе «Событие создания сущности»

updateEvents

array

Список событий обновления сущности

-

Событие обновления сущности описывает операцию модификации записи в БД.
Подробнее об этом в разделе «Событие обновления сущности»

deleteEvents

array

Список событий удаления сущности

-

Событие удаления сущности описывает операцию удаления записи из БД. Подробнее об этом в
разделе «Событие удаления сущности»

Событие создания сущности#

Описывает операцию создания новой сущности и добавления новой записи в СУБД.

Пример события:

{
  "alias": "com.sbt.pprb.integration.tests.standin.entity.Product",
  "id": "28d76d3d-d704-4df2-a0a4-28bd02915b3e",
  "version": 0,
  "primitives": {
    "field1": "testProduct",
    "field2": null
  },
  "references": {
    "owner": "1f583171-07d7-4cd0-99cc-b2d404a0ce5c"
  },
  "primitiveCollections": {
    "attributes": [
      "item1",
      "item2"
    ]
  },
  "referenceCollections": {
    "linkedProducts": [
      "bc0c2293-065f-4157-b93f-c49be51e4561"
    ]
  }
}

Список атрибутов:

Поле

Тип

Описание

Принимаемое значение

Комментарий

alias

string

Имя сущности

Любое

full qualified class name

id

string | number

Идентификатор сущности

Любое

version

number

Версия сущности

Любое

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

primitives

object

Значение полей примитивного типа

Объект, в котором имя атрибута соответствует имени поля, а его значение — значению поля

-

references

object

Значение полей ссылочного типа

Объект, в котором имя атрибута соответствует имени поля, а его значение — идентификатору сущности, на которую ссылается поле

-

primitiveCollections

object

Значение списочных полей примитивного типа

Объект, в котором имя атрибута соответствует имени поля, а его значение — список значений базового типа

-

referenceCollections

object

Значение списочных полей ссылочного типа

Объект, в котором имя атрибута соответствует имени поля, а его значение — список идентификаторов, соответствующих сущностям в коллекции

-

Событие обновления сущности#

Описывает операцию изменения существующей сущности и изменение записи в СУБД.

Пример события:

{
"alias": "com.sbt.pprb.integration.tests.standin.entity.Product",
"id": "0a4d45e2-94eb-4066-a423-ecfa4c0be983",
"version": 1,
"previousVersion": 0,
"primitiveChanges": {
"name": "updatedName"
},
"referenceChanges": {
"owner": "75cc4469-325a-43a3-8350-e44d3f771532"
},
"primitiveCollectionsChanges": {
"attributes": {
    "isCleared": false,
    "added": [
    "item2",
    "item3"
    ],
    "removed": [
    "item1"
    ]
}
},
"referenceCollectionsChanges": {
"linkedProducts": {
    "isCleared": false,
    "added": [
    "bc0c2293-065f-4157-b93f-c49be51e4561"
    ],
    "removed": [
    "4982edae-4ce8-4d2c-b54e-10105dc95796"
    ]
}
}
}

Список атрибутов:

Поле

Тип

Описание

Принимаемое значение

Комментарий

alias

string

Имя сущности

Любое

full qualified class name

id

string | number

Идентификатор сущности

Любое

-

version

number

Версия сущности

Любое

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

previousVersion

number

Старое значение версии

Любое

Значение должно быть равно версии сущности, предшествовавшей операции обновления

primitiveСhanges

object

Новые значения полей примитивного типа

Объект, в котором имя атрибута соответствует имени поля, а его значение — значению поля

-

referenceChanges

object

Объект, в котором имя атрибута соответствует имени поля, а его значение — идентификатору сущности, на которую ссылается поле

-

primitiveCollectionChanges

object

Новые значения списочных полей примитивного типа

Объект, в котором имя атрибута соответствует имени поля, а его значение — элемент модификация коллекции

Более подробная информация приведена в описании атрибутов элемента модификации коллекции

referenceCollectionsChanges

object

Объект, в котором имя атрибута соответствует имени поля, а его значение — элемент модификация коллекции

Более подробная информация приведена в описании атрибутов элемента модификация коллекции

Список полей элемента события

Поле

Тип

Описание

Принимаемое значение

Комментарий

isCleared

boolean

Флаг сброса коллекции

Любое

Установка флага в true означает, что коллекция была полностью очищена. При этом можно передать новые элементы в списке добавленных элементов. Для передачи полного состояния коллекции нужно установить значение флага "isCleared" : true и передать в списке добавленных элементов все элементы коллекции. Список удаленных элементов при этом не используется и будет игнорироваться

added

array

Список добавленных элементов или Snapshot коллекции (при установке флага isCleared)

-

-

removed

array

Список удаленных элементов

-

-

Событие удаления сущности#

Описывает операцию удаления существующей сущности и удаление записи в СУБД. Под удалением понимается физическое удаление, прикладное удаление, перенос в архив и прочее.

Пример события:

{
  "alias": "com.sbt.pprb.integration.tests.standin.entity.Product",
  "id": "e873ec23-5177-4794-b7ce-9c1a27416013",
  "version": 0
}

Список атрибутов:

Поле

Тип

Описание

Принимаемое значение

Комментарий

alias

string

Имя сущности

Любое

full qualified class name

id

string | number

Идентификатор сущности

Любое

-

version

number

Версия сущности

Любое

Значение версии сущности на момент операции удаления

Событие снимка сущности#

Описывает операцию создания или обновления сущности и представляет собой снимок сущности с перечислением всех полей и значений.

Примечание

Событие снимка сущности, в отличие от других, может примениться, даже если одно из событий было пропущено вследствие нарушения порядка.

{
  "alias": "com.sbt.pprb.integration.tests.standin.entity.Product",
  "id": "28d76d3d-d704-4df2-a0a4-28bd02915b3e",
  "version": 0,
  "primitives": {
    "field1": "testProduct",
    "field2": null
  },
  "references": {
    "owner": "1f583171-07d7-4cd0-99cc-b2d404a0ce5c"
  },
  "primitiveCollections": {
    "attributes": [
      "item1",
      "item2"
    ]
  },
  "referenceCollections": {
    "linkedProducts": [
      "bc0c2293-065f-4157-b93f-c49be51e4561"
    ]
  }
}

Список атрибутов:

Атрибут

Тип

Описание

Принимаемое значение

Комментарий

alias

string

Имя сущности

Любое

full qualified class name

id

string | number

Идентификатор сущности

Любое

version

number

Версия сущности

Любое

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

primitives

object

Значение полей примитивного типа

Объект, в котором имя атрибута соответствует имени поля, а его значение — значению поля

-

references

object

Значение полей ссылочного типа

Объект, в котором имя атрибута соответствует имени поля, а его значение — идентификатору сущности, на которую ссылается поле

-

primitiveCollections

object

Значение списочных полей примитивного типа

Объект, в котором имя атрибута соответствует имени поля, а его значение — список значений базового типа

-

referenceCollections

object

Значение списочных полей ссылочного типа

Объект, в котором имя атрибута соответствует имени поля, а его значение — список идентификаторов, соответствующих сущностям в коллекции

-

Передача значений встраиваемых типов и составных идентификаторов#

Составные идентификаторы и значения встраиваемых типов передаются как Json Object, где имена полей соответствуют именам атрибутов, а значения полей — значению соответствующих атрибутов. Значения встраиваемых типов считаются примитивами.

Пример события:

"id": {
  "compositeIdField1": 1111,
  "compositeIdField2": "ATTRIBUTE"
}
"primitives": {
  "embeddedValue": {
    "embeddedField1": 2222,
    "embeddedField2": "ATTRIBUTE"
  }
}

Передача даты и времени#

Дата и время, включая timestamp, передаются сериализованными в строку в ISO-8601-формате. Формат указывается в атрибуте serializerInfo.