Перейти к содержанию

Идентификация объектов

При получении входящего сообщения адаптер должен найти в локальной базе объект, которому оно соответствует. Задача усложняется тем, что один и тот же объект в разных системах имеет разные внутренние идентификаторы. Массив Id в теле сообщения содержит все известные идентификаторы этого объекта из всех систем-отправителей.

Структура массива Id

Каждый элемент массива — запись вида {SystemID, SystemName, EntityID}:

  • SystemID — идентификатор информационной системы в DataHUB;
  • SystemName — имя системы (для диагностики);
  • EntityID — внутренний идентификатор объекта в той системе.

Один объект может иметь идентификаторы в нескольких системах, если ранее участвовал в обмене. Подробнее о структуре — в Концепции / Идентификация объектов между системами.

Алгоритм поиска

flowchart TD
    A([Начало]) --> B[Взять следующий Id\nиз массива]
    B --> C{Это Id\nтекущей системы?}
    C -- Да --> F{Ещё есть\nId в массиве?}
    C -- Нет --> D[Найти объект\nпо SystemID + EntityID]
    D --> E[Добавить в список найденных]
    E --> F
    F -- Да --> B
    F -- Нет --> G{Сколько уникальных\nобъектов найдено?}
    G -- Ноль --> H[Объект не найден]
    G -- Один --> I[Обогатить таблицу\nидентификаторов]
    G -- Несколько --> J([Ошибка:\nнеоднозначность / конфликт])
    H --> K{Это новый объект\nили зависимость?}
    K -- Новый --> L([Создать объект])
    K -- Зависимость\nне пришла --> M([Отложить сообщение])
    I --> N([Передать объект\nв обработчик])
  1. Взять первый необработанный идентификатор из массива Id.
  2. Проверить: нужно ли искать по этой паре (SystemID, EntityID). Идентификатор текущей системы пропускается — она и так знает свой объект.
  3. Найти объект в таблице идентификаторов по паре (SystemID, EntityID). Добавить результат в список найденных.
  4. Повторить шаги 1–3 для всех идентификаторов из массива.
  5. Оценить результат:
Ситуация Результат
Ни одного объекта не найдено Объект не найден — обработчик создаёт новый
Найден ровно один уникальный объект Объект найден — перейти к шагу 6
По одному идентификатору найдено несколько объектов Ошибка — неоднозначность
По разным идентификаторам найдены разные объекты Ошибка — конфликт
  1. Сохранить в таблицу идентификаторов отсутствующие записи для найденного объекта — обогатить карту идентификаторов.
  2. Передать найденный объект в обработчик.

Обогащение идентификаторов

Шаг 6 гарантирует, что при следующем получении сообщения об этом же объекте поиск будет выполняться быстрее: таблица содержит все известные системные ссылки на один объект.

Это автоматически решает задачу маппинга между системами: адаптер не ведёт ручные таблицы соответствий — они накапливаются в процессе обмена.

Случай «Объект не найден»

Когда объект не найден, возможны два сценария:

  • Объект создаётся впервые. Обработчик создаёт новый объект в локальной базе и регистрирует его идентификатор в таблице.
  • Зависимый объект ещё не пришёл. Сообщение ссылается на объект-родитель, который ещё не получен из шины. В этом случае обработчик откладывает текущее сообщение (возвращает в очередь с задержкой) и ждёт прихода зависимого объекта.

Второй случай — штатный сценарий при параллельной отправке. Подробнее — в Отложенная обработка.

Случай «Ошибка»

Ошибки идентификации (неоднозначность или конфликт) не решаются автоматически. Обработчик фиксирует ошибку, сообщение переводится в статус «Ошибка обработки». Причины — как правило, дублирование данных в одной из систем или ошибки в логике обработчика.