Идентификация объектов
При получении входящего сообщения адаптер должен найти в локальной базе объект, которому оно соответствует. Задача усложняется тем, что один и тот же объект в разных системах имеет разные внутренние идентификаторы. Массив 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в обработчик])
- Взять первый необработанный идентификатор из массива
Id. - Проверить: нужно ли искать по этой паре
(SystemID, EntityID). Идентификатор текущей системы пропускается — она и так знает свой объект. - Найти объект в таблице идентификаторов по паре
(SystemID, EntityID). Добавить результат в список найденных. - Повторить шаги 1–3 для всех идентификаторов из массива.
- Оценить результат:
| Ситуация | Результат |
|---|---|
| Ни одного объекта не найдено | Объект не найден — обработчик создаёт новый |
| Найден ровно один уникальный объект | Объект найден — перейти к шагу 6 |
| По одному идентификатору найдено несколько объектов | Ошибка — неоднозначность |
| По разным идентификаторам найдены разные объекты | Ошибка — конфликт |
- Сохранить в таблицу идентификаторов отсутствующие записи для найденного объекта — обогатить карту идентификаторов.
- Передать найденный объект в обработчик.
Обогащение идентификаторов
Шаг 6 гарантирует, что при следующем получении сообщения об этом же объекте поиск будет выполняться быстрее: таблица содержит все известные системные ссылки на один объект.
Это автоматически решает задачу маппинга между системами: адаптер не ведёт ручные таблицы соответствий — они накапливаются в процессе обмена.
Случай «Объект не найден»
Когда объект не найден, возможны два сценария:
- Объект создаётся впервые. Обработчик создаёт новый объект в локальной базе и регистрирует его идентификатор в таблице.
- Зависимый объект ещё не пришёл. Сообщение ссылается на объект-родитель, который ещё не получен из шины. В этом случае обработчик откладывает текущее сообщение (возвращает в очередь с задержкой) и ждёт прихода зависимого объекта.
Второй случай — штатный сценарий при параллельной отправке. Подробнее — в Отложенная обработка.
Случай «Ошибка»
Ошибки идентификации (неоднозначность или конфликт) не решаются автоматически. Обработчик фиксирует ошибку, сообщение переводится в статус «Ошибка обработки». Причины — как правило, дублирование данных в одной из систем или ошибки в логике обработчика.