План
• Введение • Общие задачи интеграционной шины. Сервисы ФЭР2.
• Синхронное взаимодействие • Простое приложение Ensemble. Маршрутизация
сообщений на основе бизнес-правил. Трансформация данных.
• Асинхронное взаимодействие • Бизнес-процесс на BPL. Применение WS-Addressing.
Возможности Ensemble: надежная доставка сообщений.
Интеграционная шина
• Задачи шины: • Совместимость • Маршрутизация • Трансформация и
нормализация • Надежная доставка • Безопасность • Протоколирование
Сервисы ФЭР
• ФЭР = Федеральная Электронная Регистратура • Централизованное ведение расписаний приема врачей
• Записаться на прием к врачу можно через gosuslugi.ru • Веб-сервисы ФЭР используют SSL и SOAP 1.2 • Все запросы к сервисам на промышленном сервере
ФЭР должны быть подписаны ЭЦП (УЦ Минздрава)
• Описание сервисов ФЭР – http://egisz.rosminzdrav.ru • Документы > ЭР > Новые документы ФЭР > Описание
интеграционных профилей 2.13.docx
Тестовый сервис ФЭР
• Адрес SOAP-сервиса ФЭР: • http://api-er2.rosminzdrav.ru/mis
• Несколько десятков «методов» • См. раздел 3 документа Описание интеграционных профилей 2.13.docx
• Метод GetMos – поиск медицинских организаций (МО) • Принимает на вход набор критериев поиска МО, а также
«токен авторизации внешней системы» • Выдает список поликлиник/больниц
GetMos: запрос
Вызов сервиса ФЭР из Caché
• В терминале инициируем вызов сервиса ФЭР, используя системный класс %SOAP.WebRequest:
• do ##class(meetup25.test.TestCaller).test()
GetMos: ответ
Ensemble
• Использование инфраструктуры Ensemble для решения интеграционных задач • Бизнес-службы, бизнес-процессы, бизнес-операции • Возможность настроить отдельную очередь сообщений
для каждого бизнес-процесса/операции • Очередь обладает пулом джобов (процессов ОС),
занимающихся обработкой сообщений
Вызов сервиса ФЭР из Ensemble
• Запускаем приложение Ensemble • В классе meetup25.test.TestCaller укажем адрес веб-
сервиса Ensemble • Инициируем вызов веб-сервиса Ensemble в терминале
• do ##class(meetup25.test.TestCaller).test()
Задачи шины
• Задачи шины: • Совместимость • Маршрутизация • Трансформация и
нормализация • Надежная доставка • Безопасность • Протоколирование
Задачи шины
• Задачи шины: • Совместимость • Маршрутизация • Трансформация и
нормализация • Надежная доставка • Безопасность • Протоколирование
Маршрутизация сообщений
• Нацелим бизнес-службу на процесс «Маршрутизатор», который маршрутизирует сообщения согласно бизнес-правилу
• Бизнес-правило анализирует SOAP Action сообщения, поэтому в классе meetup25.test.TestCaller укажем значение SOAP Action равное «GetMos»
• Инициируем вызов веб-сервиса Ensemble в терминале • do ##class(meetup25.test.TestCaller).test()
Задачи шины
• Задачи шины: • Совместимость • Маршрутизация • Трансформация и
нормализация • Надежная доставка • Безопасность • Протоколирование
Трансформация запроса
• Цель: • Использовать в клиентской системе более простой и
понятный формат XML-сообщений, перенеся в Шину специфическую логику оформления запроса для ФЭР
• Этапы трансформации: • 1) Base64-кодирование исходного XML-сообщения • 2) Добавление «оберточных» XML-элементов согласно
спецификации SOAP-сервиса ФЭР
GetMos: запрос
Трансформация запроса
• Этапы трансформации: • Base64-кодирование исходного XML-сообщения • Добавление «оберточных» XML-элементов
• Применяемый шаблон XSLT будем хранить в настройке продукции
• Добавляем трансформацию meetup25.FerRequestDTL в бизнес-правило
• В классе meetup25.test.TestCaller сменим запрос на
Трансформация запроса
• В терминале выполним: do ##class(meetup25.test.TestCaller).test()
Синхронное взаимодействие
• Недостатки синхронного обмена
• В случае сбоя в сети или сбоя ФЭР клиенту потребуется повторно инициировать запрос
• Если ответ от ФЭР не укладывается в тайм-аут клиента, то ошибка
Асинхронное взаимодействие
Асинхронный процесс
Асинхронное взаимодействие
• Изменение правил маршрутизации: • Переключим цель действия send на Асинхронный
процесс • Изменения в классе meetup25.test.TestCaller:
• ONEWAY = 1 (не ожидаем синхронный ответ) • Добавим формирование заголовков WS-Addressing
• В качестве имитации callback-сервиса на стороне системы-клиента используется класс-заглушка
• do ##class(meetup25.test.TestCaller).test()
WS-Addressing
• http://www.w3.org/TR/ws-addr-core/ • WS-Addressing описывает стандартный способ
включения информации о маршрутизации в заголовки SOAP-сообщений <env:Envelope xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'> <env:Header xmlns:wsa='http://www.w3.org/2005/08/addressing'> <wsa:MessageID>urn:uuid:305EE1B2-EEF8-4095…</wsa:MessageID> <wsa:ReplyTo>http://server/callback-service…</wsa:ReplyTo> <wsa:RelatesTo>urn:uuid:7854E197-F7CF-491B…</wsa:RelatesTo> </env:Header> <env:Body> ... </env:Body> </env:Envelope>
Обработка транспортных ошибок
• Настройки бизнес-операции Вызов сервиса ФЭР: • Действия для кода ответа: E=RS • Интервал повторов: 5 (секунд) • Тайм-аут отказа: 15 (секунд) - в реальной системе
может быть несколько суток
• В случае сбоя сети или ошибки сервера ФЭР будут осуществляться повторные попытки вызова сервиса с интервалом 5 секунд в течение 15 секунд. В случае неудачи запрос будет помечен как «отложенный».
• Ensemble >> Просмотр >> Отложенные сообщения
Спасибо за внимание!