В этой лекции описывается создание посреднических (брокерных) компонентов
корпоративной сервисной шины (enterprise service Bus, ESB).
Сначала мы опишем место, которое занимает ESB в архитектуре решения,
и возможности, которые должен предоставить брокер (раздел 9.1). В следующем
разделе – 9.2, "WebSphere Business Integration Message Broker" – коротко
описывается концепция брокера сообщений и его основные компоненты.
Проектирование компонентов решения описывается в разделе 9.3, "Проектирование
компонентов". В следующих пяти разделах детально описывается реализация:
9.4, "Реализация наборов сообщений";
9.5, "Реализация таблиц баз данных";
9.6, "Создание потоков сообщений";
9.7, "Создание кода ESQL для потоков сообщений";
9.8, "Размещение набора сообщений и потоков".
Например, мы опишем, как следует тестировать и отлаживать потоки сообщений.
9.1 Архитектура
Здесь мы повторим, какое место занимает ESB в архитектуре системы и решения.
Архитектура системы
На рис 9.1 показана архитектура системы работы с внешними оценщиками. Возвращаясь
к обсуждению, приводимому в лекции 5, "Архитектура системы", поскольку мы
используем версию 5 платформы WebSphere, мы решили ограничить ESB шаблоном
Extended Enterprise, а для интеграции приложений применить шаблон Application
Integration. Шаблон Extended Enterprise отвечает за потоки, идущие к внешним оценщикам
и от них. В версии 6 платформы WebSphere мы намереваемся расширить ESB,
и включить в нее все компоненты решения, используя надежные соединения между
всеми службами.
(рис 9.1) Система работы с внешними оценщиками: связь с продуктамиЗадача, которую мы ставим для данной лекции, – это реализация служб маршрутизации
и объединения, а также установление соединения между зоной LGI и внешними
оценщиками. И снова, исключительно из соображений экономии ресурсов, мы не
уделяем внимания реализации шлюза Web-служб, безопасности и различным типам
соединения с оценщиками, таким, как браузер, EDI, передача файлов, электронная
почта, факс или взаимодействие Web-служб.
Если изучить рис 9.1 более детально, то видно, что мы используем брокер сообщений
для выполнения двух функций, которым соответствуют квадраты с буквами А и В.
Предлагаются специфические службы маршрутизации, распределения и объединения для ESB:Брокер отвечает за создание адресов для маршрутизации запросов к конкретным
оценщикам с учетом протокола, качества обслуживания и местонахождения
оценщика и за размещение запроса в соответствующем транспортном соединении.
Если исходная технология соединения не обеспечивает качества
обслуживания, необходимого для брокера, то брокер отвечает за наилучшее
использование возможностей соединения.Технология соединений, используемая брокером, почти всегда связана с ретрансляцией
адреса пункта назначения. Это может быть шлюз Web-служб, реализующий
для адреса функции прокси из соображений удобства использования
и обеспечения безопасности, или DNS-служба, преобразующая имя хоста в IP-адрес.
За маршрутизацию отвечает не только брокер. Ему нужно взаимодействовать
со службами, относящимися к технологии соединения. Сам же он обеспечивает
стабильный интерфейс служб для любых компонентов, которые либо сами реализованы
как службы, либо заключены сервисной шиной в службы-оболочки.
Частью возможностей, которые дает сервисная шина, являются посреднические
функции. Посреднические функции обеспечивают гибкость при установлении
соответствий между логическими и физическими интерфейсами служб.
Эти функции могут быть простыми, например изменение порядка параметров
службы, или сложными, связанными с изменением данных, преобразованием
данных и преобразованием типов. Нам потребуются довольно сложные формы
посреднических функций, такие, как соответствие "один ко многим"
и "многие к одному", т. е. распространение и объединение (агрегация).Запрос на оценку принимается ( А ) от процесса RequestExternalAssessment в виде
единичного запроса от службы, в котором содержится список потенциальных
оценщиков. Список разделяется на отдельные запросы, которые посылаются
индивидуальным оценщикам ( В ). Через определенный период времени
оценщики возвращают ответы ( С ). Когда согласованный в контракте промежуток
времени истекает, брокер объединяет (агрегирует) полученные запросы
и вызывает службу ответа, предоставленную процессом RequestExternalAssessm
ent, передавая в нее единый список ответов от оценщиков ( D ). Ответы, пришедшие
слишком поздно, отбрасываются ( Е ).
Еще одна возможность – это обеспечение шины различными формами транспортных
протоколов. В WebSphere Business Integration Message Broker поддерживается
несколько протоколов связи, и мы собираемся работать в Web-службами, используя
протоколы SOAP/http и SOAP/http через WebSphere MQ. Дизайн потоков в брокере
позволяет службам связываться, используя любой протокол.
(рис 9.2) Схематическое изображение распределения, агрегации и маршрутизации в брокере
Архитектура решения
Схема последовательностей, приведенная на рис 9.3, показывает взаимодействия
с компонентом ESB proxyAssessorSystem. Взаимодействия, выделенные красным цветом,
отражают службы, которые предоставляет компонент proxyAssessorComponent.
(рис 9.3) Схема последовательностей proxyAssessorAutomationВзаимодействия описаны в табл. 6.1. В табл. 9.1
(созданной на основе табл. 6.2)
приводится общий обзор взаимодействий системы proxyAssessorAutomation и идентифицируются
WSDL-файлы, определяющие службы. Система proxyAssessorSystem отмечается
там, где она отвечает за предоставление служб. Для взаимодействий системы
proxyAssessorSystem нужно разработать сервисные потоки, а для других систем – клиентские потоки.
Сведения о WSDL-файлах
| Поток |
Компонент |
Данные об интерфейсе – имя WSDL-файла |
| 3 |
Proxy Assessor System |
AssessorAvailability(3).wsdl |
| 4 |
Assessor |
Availability(4).wsdl |
| 4a |
Proxy Assessor System |
AssessorAvailabilityPT(4a).wsdl |
| 3a |
Assessor Automation |
AssessorAvailablityList(3a).wsdl |
| 6 |
Proxy Assessor System |
AllocateAssessmentReport(6).wsdl |
| 7 |
Assessor |
DeliverAssessment(7).wsdl |
| 7a |
Proxy Assessor System |
DeliverAssessmentResponse(7a).wsdl |
| 6a |
Assessor Automation |
AllocateAssessorResponse(6a).wsdl |
| 8 |
Proxy Assessor System |
AssessorReport(8).wsdl |
| 9 |
Assessor Automation |
AssessorReport(9).wsdl |
9.2 WebSphere Business Integration Message Broker
WebSphere Business Integration Message Broker – это продукт, выполняющий функции
брокера сообщений в семействе продуктов WebSphere Business Integration. Это семейство
состоит из нескольких серверных продуктов, которые на различных уровнях
играют роли, связанные с интеграцией.
Брокер относится к уровню служб, обеспечивающих в архитектуре бизнес-интеграции
WebSphere связь приложений (Application Connectivity Services)(рис 9.4). Этот
уровень выполняет такие функции, как маршрутизация, посредничество, трансформация
и публикация/подписка. Эти функции, как правило, осуществляются "поверх"
инфраструктуры обмена сообщениями, такой, как WebSphere MQ.
(рис 9.4) Образец архитектуры бизнес-интеграции WebSphereПри переходе с архитектуры, ориентированной на сообщения, к сервис-ориентированной
архитектуре, брокер приобретает новую роль. Он служит мостом между
традиционными методами интеграции приложений, использующими адаптеры
и промежуточное программное обеспечение, ориентированное на сообщения, и развивающимся
миром интеграции служб, использующих сервисные шины. Начиная
с версии 5, брокер предлагает интеграцию времени выполнения с транспортным
протоколом SOAP/http.
Гибкость модели обмена сообщениями и инструментария брокера означает, что
в потоках сообщений брокера могут предоставляться и использоваться SOAP-службы.
Именно эту возможность мы собираемся использовать для предоставления SOAP-служб
через HTTP, и ее можно легко адаптировать к JMS.
9.2.1 Компоненты брокера сообщений
WebSphere Business Integration Message Broker V5 состоит из следующих компонентов:
инструментарий Message Brokers Toolkit для WebSphere Studio – новая возможность, заменившая центр управления (Control Center) WebSphere MQ Integrator V2.1, а также имеющая расширенные возможности во многих новых областях;
менеджер конфигураций (Configuration Manager), содержащий хранилище для конфигураций и сообщений;
брокеры сообщений (Message broker) – компонент рабочей системы, состоящий из групп выполнения, которые содержат размещенные потоки сообщений;
функция публикация/подписка;
менеджеры очередей WebSphere WebSphere MQ, которые формируют базовую транспортную инфраструктуру для WebSphere Business Integration Message Broker;
прикладные пользовательские программы, которые генерируют сообщения и запрашивают их для проведения трансформации и маршрутизации в другие точки назначения внутри инфраструктуры обмена сообщениями в соответствии с определенными бизнес-правилами.
На рис 9.5 показана совместная работа этих компонентов.
(рис 9.5) Компоненты и структура домена брокераРабочее место (Broker Workbench)
ИТ-специалист по интеграции использует инструментарий брокера на основе Eclipse
для создания и сохранения компонентов решения в локальном рабочем пространстве
или в системе контроля версий.
Инструментарий брокера состоит из нескольких дополнений (плагинов)
к WebSphere Studio. Эти плагины можно загрузить в уже инсталлированную копию
WebSphere Studio, или можно использовать рабочую систему WebSphere Studio,
поставляемую на компакт-диске WebSphere Business Integration Message Broker.
Менеджер конфигураций
Для размещения решений ИТ-специалист сохраняет готовые наборы сообщений
и потоки сообщений в хранилище менеджера конфигураций, которое представляет
собой базу данных DB2. Затем их можно разместить в одном или нескольких
брокерах. Брокеры, которые представляют собой компоненты рабочей системы, доступны
для различных платформ, в том числе:
для Windows;
нескольких версий UNIX $$\text{\textregistered}$$, включая Linux;
z/OS.
Набор брокеров, поставленных в соответствие данному менеджеру конфигураций
или связанных с ним, называется доменом брокеров. С рабочего места вы можете
конфигурировать связи в одном или нескольких доменах брокеров, например в
доменах тестирования, разработки и рабочем домене.
На рис 9.6 в разделе Domain Connections (Соединения доменов) есть только один
домен брокеров. В редакторе связей доменов показана информация для соединения
с WBRK_BROKER, которую мы сконфигурировали в разделе 7.2.5, "Инсталляция и конфигурирование
брокера сообщений". Связь домена брокеров представляет собой связь
клиента WebSphere MQ с менеджером очереди, который находится в подчинении у менеджера
конфигурации. Домен брокеров для нашего решения состоит из менеджера
конфигурации и только одного брокера с соответствующими им базами данных.
(рис 9.6) Инструментарий, связанный с доменом брокеровКогда администратор брокера с рабочего места размещает решение в брокере конкретного
домена, рабочее место взаимодействует с менеджером конфигураций, используя
соединение с данным доменом. Менеджер конфигураций отвечает за синхронизацию
конфигураций брокеров. Менеджер конфигураций будет отправлять новые артефакты
решения при помощи команды размещения брокеру, используя WebSphere MQ.
Брокер
Сам брокер состоит из нескольких компонентов (рис 9.7). Процесс брокера осуществляет
управление несколькими процессами и мониторинг их, каждый из которых
называется DataFlowEngine (система потока данных). Каждый процесс
DataFlowEngine соответствует административной группе выполнения (execution
group). Группа выполнения может обрабатывать одновременно несколько размещенных
потоков сообщений в соответствии с многонитевой моделью выполнения. В одном
брокере может работать несколько групп размещения, и ими можно управлять
по отдельности (т. е. размещать, запускать, останавливать, удалять и т. д.).
(рис 9.7) Структура брокераПотоки часто начинаются с узла MQInput, а это означает, что поток сообщений
начинается с чтения сообщения из очереди. Это сообщение затем передается дальше
по направлению графа с выполнением логики, которую моделирует поток. Еще один
часто применяемый тип входного узла – это узел HTTPInput. Этот узел используется
для получения потоковых данных (data streams) протокола HTTP. Мы используем
в нашей реализации оба типа входных узлов – и MQInput и HTTPInput.
Потоки сообщений в брокере могу использовать базы данных, а также выполнять
поиск и сохранение данных в потоках. Поддерживается несколько продуктов – баз
данных, в зависимости от конкретной платформы. С брокером часто используются
продукты DB2 и Oracle. В Windows также поддерживается SQL Server. Для нашей базы
данных мы использовали DB2.
Модель сообщений
На рис 9.8 показан общий обзор различных компонентов модели сообщений.
Каждый из них будет подробно описан ниже.
(рис 9.8) Общий обзор модели сообщенийВсе ресурсы, относящиеся к сообщениям, хранятся в файлах в хранилище в
рабочем пространстве, и это часть интеграции семейства Eclipse.
Наборы сообщений
Проект набора сообщений (message set project) – это контейнер для всех ресурсов,
относящихся к одному-единственному набору сообщений. Набор сообщений (message
set) – это логическая группа сообщений и объектов, их составляющих (элементов,
типов, групп). В содержимое набора сообщений входит:
файл с одним набором сообщений (messageSet.mset);
один или несколько файлов определений сообщений (.mxsd);
нуль и более файлов категорий сообщений (.category).
Единственный файл набора сообщений (.mset) содержит информацию, которая
является общей для всех сообщений набора. Эта информация редактируется при
помощи редактора наборов сообщений.
Каждый файл определений сообщений (.mxsd) содержит определения сообщений,
элементов, типов и групп. Для каждого набора сообщений требуется как минимум
один файл определений сообщений, описывающий сообщения, входящие в набор,
хотя для удобства управления можно распределить определения сообщений по
нескольким файлам. Файлы определений сообщений используют для описания логического
формата сообщений язык XML-схем. Физический формат сообщений сохраняется
с применением аннотаций XML-схем. Для создания и редактирования логической
структуры и физического формата сообщений можно использовать редактор
определений сообщений.
Сообщения могут группироваться в категории из соображений удобства и упрощения
генерации WSDL. Группы определяются в файлах .category.
Средства импорта сообщений
Файлы определений сообщений могут создаваться и заполняться с помощью одного
из имеющихся средств импорта. Средства импорта доступны для ХML DTD, XML-схем,
структур C и структур COBOL. Средства импорта можно применять либо с помощью
команды mqsicreatemsgdefs, либо с помощью инструментария Message Brokers
Toolkit.
Существует также утилита командной строки mqsimigratemsgsets для переноса
наборов сообщений WebSphere MQ Integrator V2.1 в наборы сообщений WebSphere
Business Integration Message Broker V5.
Редакторы сообщений
Файлы наборов сообщений, файлы определений сообщений и файлы категорий сообщений
имеют свои собственные редакторы, которые применяются для создания
и обслуживания этих ресурсов. Хотя с внутренней точки зрения эти файлы представляют
собой XML, для редактирования ресурсов всегда следует использовать поставляемый
редактор.
Средства экспорта сообщений
Существуют средства генерации, позволяющие экспортировать наборы сообщений
в стандартные внешние форматы. К этим форматам относятся:
словарь сообщений для размещения в брокере;
XML-схема для проверки передаваемых XML-сообщений;
описания Web-служб (WSDL) для клиентов Web-служб;
документация (в виде HTML).
Модель сообщений проверяется при каждом сохранении файла набора сообщений,
файла определения сообщений или файла категорий сообщений. Проверяется
целостность логической структуры модели и физических форматов.
9.3 Проектирование компонентов
При проектировании компонентов для proxyAssessorSystem следует принимать во
внимание несколько составляющих окончательной реализации:
Наборы сообщений, соответствующие интерфейсам решения.
Потоки сообщений и независимость от транспортного протокола.
Таблицы баз данных.
Распределение и агрегация.
В этом разделе описывается высокоуровневый дизайн и проблемы при
реализации этих четырех областей.
9.4 "Реализация наборов сообщений"
9.5, "Реализация таблиц баз данных"
9.6, "Создание потоков сообщений"
9.7, "Создание кода ESQL для потоков сообщений"
9.3.1 Наборы сообщений
Для каждого из 10 интерфейсов, перечисленных на рис. 9.1, существует SOAP-сообщение-запрос,
а иногда и сообщение-ответ. Нам нужно иметь возможность читать и посылать
сообщения, форматы и содержимое которых соответствуют этим 10 интерфейсам.
Выбор обработчика
В WebSphere Business Integration Message Broker доступ к содержимому сообщений
в протоколе SOAP предоставляет XML-обработчик или MRM-обработчик. XML-обработчик
достаточно эффективен, но не имеет возможности проверять сообщения
и не требует предоставления определения сообщения. Это может рассматриваться
и как преимущество и как недостаток. Обработчик интерпретирует SOAP-сообщение
в работающей системе, используя XML-теги в этом сообщении. MRM-обработчик, напротив,
может проверять сообщения по их определениям, требует предоставления
определения, а в ходе создания потока сообщений может помочь в анализе содержимого
сообщений при выполнении SQL-инструкций, которые запрашивают и записывают
сообщения.
На практике, если форматы сообщений известны заранее, лучше всего использовать
для разработки и тестирования потоков сообщений MRM. В готовой системе переход
на XML-обработчик может дать выигрыш в производительности.
Создание определений сообщений для SOAP-интерфейсов
WebSphere Business Integration Message Broker импортирует файлы схем, но он не
имеет средств импорта WSDL. Чтобы создать определения сообщений по WSDL-файлам,
нам нужно извлечь определения схем из высокоуровневых элементов сообщений,
содержащихся в WSDL-файле, предоставленном архитектором решения, и импортировать
эти определения в набор сообщений WebSphere Business Integration
Message Broker. Каждому интерфейсу (и запрос и запрос/ответ рассматриваются как
один интерфейс) соответствует свое определение в одном и том же наборе сообщений.
Далее, импортируя схему, созданную по определению SOAP 1.1 WSDL, и объединяя
эту SOAP-схему со схемой каждого интерфейса, мы создаем определения сообщений
для каждого интерфейса.
Все необходимые файлы схем мы уже создали из соответствующих WSDL-файлов
и сохранили в директории дополнительных материалов .\SG24-6636\Broker\Schemas.
Процедура преобразования WSDL в схему описывается в следующих разделах.
Главная проблема, с которой мы встретились и с которой в какой-то момент сталкиваются
все проекты, состоит в наличии нескольких копий одних и тех же определений,
для которых существует возможность десинхронизации. Необходимо сформировать
процедуру, операционную или техническую, обеспечивающую синхронизацию определений.
Один подход – это поместить все определения в файлы схем и использовать инструкции
импорта в WSDL-файлах. Мы избрали подход, при котором WSDL является главным
источником, а системный архитектор отвечает за все определения интерфейсов.
Реализация всех определений интерфейсов описывается в разделе 9.4, "Реализация
наборов сообщений".
9.3.2 Потоки сообщений и независимость от транспортного протокола
На схеме последовательностей (рис 9.3) показаны все взаимодействия системы
proxyAssessorSystem. В качестве примера на рис 9.9 более подробно показаны потоки
3, 3a, 4 и 4a.
(рис 9.9) Потоки 3, 3a, 4 и 4aКаким образом следует устанавливать соответствия между интерфейсами, показанными
на рис. 9.9, и потоками сообщений в брокере?
Будет как минимум один поток для каждой службы, предлагаемой брокером (в таблица 9.1.
Существует пять потоков, которые вызывают выходные интерфейсы. Они называются клиентскими потоками (Client Flows), поскольку они являются клиентами Web-служб, предоставляемых другими серверами.
Для поддержки тех взаимодействий, которые в LGI переводятся с SOAP/Http на SOAP/JMS, входные и выходные узлы LGI разделены и упакованы в специальный, специфический для транспортного протокола, проект набора сообщений.
Существуют потоки Fault (Ошибка) и Reply (Ответ), которые являются общими для всех сервисных потоков в решении, и они реализованы в виде специфичных для транспортного протокола потоков. Они возвращают ответы или ошибки клиентам служб, реализуемых брокером.
Клиентские потоки должны перехватывать любые ошибки, возникающие в потоках, или возвращаемые службами, которые они вызывают.
Эти ошибки не возвращаются в сервисный поток, который вызывал клиентский
поток, поскольку возможность использовать обработчик ошибок сервисного потока
уже упущена. Сервисный поток уже вернул ответ-подтверждение своему клиенту,
и клиент больше не ждет ответа.
Обработчик ошибок в клиентских потоках реализован в виде узла TryCatch, соединенного
с входным узлом подпотока. Ошибки передаются в отдельный обработчик
ошибок, который мы назвали потоком клиентской ошибки (ClientError).
В данном проекте все взаимодействия с оценщиками ограничиваются протоколом SOAP/http и обрабатываются как часть главного потока.
Одним из способов разработки выходных потоков к оценщикам с поддержкой
дополнительных транспортных протоколов является использование узла RouteToLabel
(Передача на метку) с вызовом разных выходных потоков для каждого протокола
на основе метки, выбранной в потоке. Для входных потоков от оценщиков мы снова
используем концепцию отделения входного потока от входного интерфейсного потока
с созданием для каждого типа транспорта своего входного потока.
Помимо этих типов потоков, для входящих подтверждений, относящихся к запросам,
посланным через MQ или JMS-систему, есть отдельные потоки Ack, поскольку
не существует комбинированного узла "запрос/ответ". Ответ должен передаваться
в отдельном потоке. Нам не нужны эти дополнительные потоки при использовании
SOAP/Http, поскольку для SOAP/Http существует синхронный узел
HttpRequest. Следовательно, Ack-потоков для SOAP/Http не существует, и нам не
нужно создавать такие потоки для нашего решения.
Различные типы потоков и их взаимоотношения показаны на рис 9.10.
(рис 9.10) Разделение общих потоков и потоков, специфичных для транспортного протоколаПреимущества упаковки транспортно-специфических потоков LGI (верхний ряд
синих прямоугольников) отдельно от общих потоков и потоков оценщика (оранжевый
нижний ряд прямоугольников) состоит в том, что при переводе шины LGI с SOAP/Http
на SOAP/JMS необходимо изменить только потоки, обозначенные синим цветом.
С помощью небольшого художественного надругательства над исходными UML-схемами
последовательностей (рис 9.11) мы показали соответствия потоков
AssessorAvailability части схемы последовательности из Rational Software Architect
с целью графически продемонстрировать корреляцию между потоками, которые мы
разработали для брокера, и взаимодействиями, указанными в архитектуре решения.
(рис 9.11) Потоки в AssessorAvailabilityНа рис 9.12 показано эквивалентное представление потоков Assessor Report.
(рис 9.12) Потоки в Assessor Report
Краткие описания потоков
В табл. 9.2 показаны общие потоки,
а в табл. 9.3 – потоки, независимые от транспортных
протоколов, некоторые из которых также взаимодействуют с оценщиками,
а в табл. 9.4 показаны потоки, взаимодействующие с LGI.
Общие потоки
| Поток |
Вызывает |
Описание |
| ClientError (Клиентская ошибка) |
|
Перехватывает ошибки из клиентских потоков |
| Fault (Ошибка) |
|
Предотвращает зацикливание сообщений, генерирует и выводит ошибку SOAP, выводит сообщение об ошибке |
| Reply (Ответ) |
|
Посылает сообщение-ответ в нужном формате |
Потоки, независимые от транспорта, и потоки к оценщикам и от них
| Потоки |
Что вызывает |
Описание |
| Потоки Assessor Availability |
| Поток3 |
Поток4 |
Получение запроса списка доступных оценщиков |
| Поток3a |
Выход3a |
Агрегирование и возврат списка доступных оценщиков |
| Поток4 |
EAEA – External Accessor (Внешний оценщик) |
Распределяет запрос о готовности среди оценщиков |
| Поток4а |
Поток3a |
Получает ответы с данными о готовности от оценщиков |
| Потоки Assessor Report |
| Поток6 |
Поток7 |
Получение запроса отчета об оценке |
| Поток6a |
Выход6a |
Возврат подтверждения от оценщика |
| Поток7 |
EA |
Запрос оценки у оценщика |
| Поток7a |
Поток6a |
Получение согласия от оценщика |
| Поток8 |
Поток9 |
Получение отчета об оценке от оценщика |
| Поток9 |
Выход9 |
Отправка отчета об оценке, полученного от оценщика |
Потоки, специфичные для транспортного протокола, направленные в LGI и от нее
| Потоки |
Что вызывает |
Описание |
| Потоки Assessor Availability |
| Поток3 |
Поток3 |
Получение запроса списка доступных оценщиков |
| Выход3a |
AASAAS – Assessor Automation System (Cистема автоматизации работы с оценщиком) |
Агрегирование и возврат списка доступных оценщиков |
| Поток3aAck |
|
Обработка подтверждения приема списка оценщиков |
| Потоки Assessor Report |
| Поток6 |
Поток6 |
Получение запроса отчета об оценке |
| Выход6a |
AAS |
Возврат согласия от оценщика |
| Поток6aAck |
|
Обработка подтверждения приема согласия |
| Поток9 |
EA |
Отправка отчета об оценке, полученного от оценщика |
| Поток9Ack |
|
Обработка подтверждения приема отчета |
9.3.3 Таблицы баз данных
Для системы proxyAssessorAutomation требуется три таблицы базы данных для управления
корреляцией данных, проходящих между службами.
CLAIMASSESSOR
Таблица CLAIMASSESSOR используется для хранения сведений о запросах готовности,
направляемых оценщикам (поток4), и в нее заносится информация об ответах оценщика на эти запросы.
Таблица CLAIMASSESSOR
| Имя столбца и ключ |
Тип |
Что обновляет данные |
| claimID (index ca1) |
Integer |
Поток4 |
| assessorID (index ca1) |
Integer |
Поток4 |
| assessorURL |
Long Varchar |
Поток4 |
| location |
Char(100) |
Поток4 |
| reqdate |
Date |
Поток4 |
| makeOfCar |
Char(15) |
Поток4 |
| registration |
Char(7) |
Поток4 |
| predDate |
Date |
Поток3a |
| predCost |
Integer |
Поток3a |
| replytoq |
Char(48) |
Поток4 |
| replytoqmgr |
Char(48) |
Поток4 |
| correlid |
Blob(24) |
Поток4 |
| requestcompletetime |
Timestamp |
Поток3a |
ACTIONASSESSOR
Таблица ACTIONASSESSOR используется для хранения информации о запросах
подтверждения, направляемых оценщикам (поток7), и в нее заносится информация от
ответах оценщика на эти запросы.
Таблица ACTIONASSESSOR
| Имя столбца и ключ |
Тип |
Что обновляет данные |
| claimID (index aa1) |
Integer |
Поток7 |
| assessorID (index aa1) |
Integer |
Поток7 |
| assessorURL , |
Long Varchar |
Поток7 |
| location |
Char(100) |
Поток7 |
| reqDate |
Date |
Поток7 |
| makeOfCar |
Char(15) |
Поток7 |
| registration |
Char(7) |
Поток7 |
| ackfromassessor, |
Char(10) |
Поток7ack |
| confirmedDate |
Date |
Поток6a |
| accepted |
Char(5) |
Поток6a |
| replytoq |
Char(48) |
Поток7 |
| replytoqmgr |
Char(48) |
Поток7 |
| requestcompletetime |
Timestamp |
Поток6a |
| rejected |
Char(20) |
Поток8 |
| rejectedDate |
Date |
Поток8 |
RESOLVEASSESSOR
Таблица RESOLVEASSESSOR используется, если существует несколько типов оценщиков
с разными форматами сообщения, и нам нужно определить, оценщику какого
типа посылается конкретное сообщение. Данная таблица связывает тип с каждым
идентификатором оценщика, а также предоставляет технические данные, например
HTTP-адрес. В данной реализации доступ ко всем оценщикам осуществляется по
протоколу SOAP/http, и мы эту таблицу не используем.
| Имя столбца и ключ |
Тип |
| assessorID (index ra1) |
Integer |
| assessorType |
Char(10) |
| assessorhttpaddress |
Long Varchar |
| lgibrokerhttpaddress |
Long Varchar |
9.3.4 Распределение и агрегация
Важной возможностью, которую предоставляет брокер, является распределение и агрегация
сообщений. В системе proxyAssessorSystem данная возможность используется
для отправки подходящим внешним оценщикам запросов на выдвижение предложений
по проведению оценки претензии, а затем для объединения получаемых ответов.
Процесс ExternalClaimAssessor посылает список подходящих оценщиков в систему
proxyAssessorSystem. Система proxyAssessorSystem разделяет список на отдельные запросы
(которые в полной реализации будут отправляться с использованием разных
транспортных протоколов) и отправляет их через SOAP/Http, получая подтверждения
от каждого оценщика, получившего запрос. В течение какого-то времени, которое
определяется контрактом между LGI и оценщиками и которое может зависеть от
вида страховки клиента, все оценщики могут присылать предложения. Предложения
объединяются (агрегируются) системой proxyAssessorSystem и посылаются процессу
ExternalClaimAssessor в виде единого списка.
Узлы агрегации
Брокер предлагает три узла для реализации агрегации:
Узел Aggregate Control.
Узел Aggregate Request.
Узел Aggregate Reply.
Узлы Aggregate Control и Aggregate Request используются в потоке распределения,
а узел Aggregate Reply – в потоке агрегации для сбора ответов. Узлы агрегации формируют
основу для реализации распределения и агрегации. ИТ-специалист по брокеру
должен связать поток сообщений с этими узлами и обработать создание разветвляющихся
сообщений и сборного сообщения. Прежде чем обращаться к проектированию
системы proxyAssessorSystem, следует принять во внимание несколько вопросов,
связанных с проектированием.
Один поток или два?
Потоки распределения и агрегации могут представлять собой один и тот же физический
поток. Время жизни всего процесса распределения/агрегации – это время
жизни этого потока. В качестве альтернативы процесс можно реализовать в виде двух
потоков, с управляющим сообщением, передаваемым из потока распределения в поток
агрегации для координации между собой двух частей процесса. Реализовать один
поток проще, но два потока более гибки в плане реализации транзакционных функций
и предоставляют больше возможностей для управления в период выполнения,
например запуск в разных группах выполнения.
Транспортные протоколы
Готовая система агрегации поддерживает любой транспортный протокол,
используемый для получения и возврата списка оценщиков в процесс ExternalClaimAssessors.
Промежуточные потоки, направляемые к оценщикам и от них должны работать с использованием
одного из встроенных транспортных протоколов, поддерживающих
протокол типа запрос/ответ:
WebSphere MQ Enterprise Transport (узлы MQInput и MQOutput);
WebSphere MQ Mobile Transport (узлы MQeInput и MQeOutput).
Брокер не поддерживает встроенные протоколы, которые не соответствуют
модели запрос/ответ или пользовательские транспортные протоколы:
WebSphere MQ Web services Transport (узлы HTTPInput, HTTPReply и HTTPRequest);
WebSphere MQ Real-time Transport (узлы Real-timeInput и Real-timeOptimizedFlow);
WebSphere MQ Telemetry Transport (узлы SCADAInput и SCADAOutput).
Нам нужно, чтобы служба агрегации поддерживала любой тип транспортного
протокола, поскольку мы разрешаем оценщикам связываться с LGI, используя разные
протоколы. Решением является преобразование в брокере потоков, связанных с
определением готовности оценщиков, для использования WebSphere MQ и преобразование
запросов, направляемых к оценщикам и от них, между протоколами WebSphere
MQ и HTTP/SOAP. В документах центра информации версии 5 описываются интерфейсы
узлов агрегации, позволяющие создавать агрегационные потоки, не относящиеся
к WebSphere MQ. Реализация такого интерфейса имеется в WebSphere Business
Integration Message Broker Version 6.0, и в нее входит поддержка агрегации для протокола
SOAP/http, что устраняет необходимость использовать промежуточные потоки
WebSphere MQ.
Надежность и тайм-ауты
Важная часть проектирования агрегации – это вопрос времени. Исходя из наших условий,
мы имеем дело с растянутым во времени процессом, и должны учитывать,
сколько времени должно длиться ожидание ответа, что делать с опоздавшими ответами
и, поскольку мы оперируем при сборе ответов сроками, составляющими часы
и дни, последствиями нарушения процесса агрегации.
Тайм-ауты
Истечение времени ожидания (тайм-аут) следует рассматривать как часть требований,
предъявляемых к процессу, и его должны задавать бизнес-аналитик и архитектор.
В нашем случае значения тайм-аута включаются в контракты с клиентами
и оценщиками. Нужно установить два вида тайм-аутов. На рис 9.13 зелеными кружками
обозначены узлы, для которых нужно установить тайм-ауты.
(рис 9.13) Полное представление распределения и агрегации сообщенийПервый тайм-аут относится к узлу Aggregate Control. Он управляет общей продолжительностью
процесса агрегации: сколько времени процесс будет ждать ответа от оценщиков.
Значение, указанное в контракте между LGI и оценщиками, должно удовлетворять
времени ответа, которое ожидает от LGI клиент, которому был продан страховой
полис. Как только срок тайм-аута превышен, узел Aggregation Reply начинает направлять
ответы на другой выходной терминал – для обработки опоздавших ответов.
В случае процесса обработки претензии существует два класса клиентов с разными
ожидаемыми временами ответов, для которых, следовательно, необходимо определить
два разных параметра тайм-аута. Поскольку значение тайм-аута жестко прописано
в свойстве узла Aggregate Control, для двух разных типов клиентских контрактов
нужно создать два узла Aggregate Control. В нашей реализации, для упрощения,
поддерживается только один полис с прописанным временем ответа.
Второе значение таймаута, которое устанавливается для узла Aggregation Reply, выбрать
сложно, но оно не является очень критических. В нем указывается, как долго узел
Aggregation Reply будет ждать получения сообщения, прежде чем будет принято решение
о невозможности связать его с управляющим сообщением, посланным из узла Aggregation
Control. После истечения срока тайм-аута узел Aggregation Reply отправляет сообщение
на свой терминал Unknown. Это глобальное свойство узла Aggregation Reply.
В качестве иллюстрации представьте себе такую ситуацию: вы планируете сесть
на поезд, идущий в Лондон на безлюдной станции. Вы знаете, что поезда на Лондон
ходят довольно точно по расписанию, и вы хотите сесть на поезд в 10:00. Если вы
попадете на станцию в 10:01 и поезда на станции не окажется, будет ли это означать,
что вы пропустили поезд или что поезд опаздывает? Сколько вы будете ожидать на
станции, прежде чем решите, что вы пропустили поезд? В данном примере поезд –
это управляющее сообщение время, которое он проводит у платформы, – общая
продолжительность агрегации, а пассажиры, желающие попасть на поезд, – это агрегируемые
ответы. Второе значение тайм-аута – это время ожидания, прежде чем будет
принято решение о том, что поезд ушел или вообще не придет.
Выбор значения для второго тайм-аута определяет, когда сообщения-ответы начинают
передаваться на терминал Unknown, обозначая возникновение каких-то неполадок.
В нашем сценарии приемлемым вариантом будет установление для второго
тайм-аута значения, равного общей продолжительности агрегации.
Прерывания
Узел Aggregation Reply сохраняет свое состояние в базе данных брокера, так что короткие
прерывания в потоке сообщений не вызовут чрезмерных проблем. При возобновлении
потока узел Aggregation Reply будет продолжать работать, если не истек
срок тайм-аута. В случае более длительных прерываний потока, если поток снова начинает
работать уже после истечения срока тайм-аута, сообщения, поступающие
после останова потока, будут рассматриваться как опоздавшие ответы.
Проектирование потоков распределения и агрегации
В центре информации брокера существует обширная документация с техническими
сведениями об агрегации и о том, как следует создавать решения. На рис 9.13 вся эта
информация сведена в единую схему, которую мы будем использовать для связывания
разных частей реализации, распределенных по множеству потоков, esql-файлов и узлов
обработки сообщений. Для описания дизайна мы изучим потоки, один узел
за другим, используя рис 9.13.
Поток 4
Запрос о готовности, полученный от процесса ExternalClaimAssessor, был принят
и проверен. Поток 4 вызывается из потока 3.
Подготовка
1. Сообщение HTTP/SOAP принимается из входного серверного потока (Input) после проверки.
2. Узел TryCatch определяет контекст ошибки для оставшейся части обработки, выступая в роли SOAP-клиента при запрашивании информации о готовности у всех оценщиков.
3. Узел удаления из базы, Delete Claim Status, используется для очистки информации о состоянии предыдущей претензии перед обработкой нового запроса.
4. Узел Prepare MQ удаляет все следы HTTP-запроса из папок брокераМы обнаружили, что некоторые функции брокера могут быть введены в заблуждение, если в брокере одновременно присутствуют папки MQ и http. Поэтому важно при переключении транспортных протоколов очищать старые ненужные папки. и задает папку MQ для создания нового MQ-сообщения.
Aggregate Control
5. Узел Aggregate Control (AC) запускает процесс распределения/агрегации:
Как уже говорилось ранее, в узле АС указывается тайм-аут ответов.
Также агрегату присваивается имя, чтобы отличить его среди других агрегатов, которые могут формироваться. Например, мы реализовали разные агрегаты с разными временами ответа.
Узел АС помещает информацию в папку LocalEnvironment, которая должна быть связана с узлом Aggregate Request и узлом MQ Output, которые будут посылать управляющее сообщение на узел Aggregate Reply.
Узел PrepareMQControl создает управляющее сообщение, которое посылается по MQ к Flow4.(MQMD). В примере 9.1 показано, как можно создать новый MQMD.
CREATE NEXTSIBLING OF OutputRoot.Properties DOMAIN 'MQMD';
SET OutputRoot.MQMD.StrucId = MQMD_STRUC_ID;
SET OutputRoot.MQMD.Version = MQMD_CURRENT_VERSION
Fan-Out
6. Узел Fan-Out распространяет отдельные сообщения-запросы последовательно по
оставшейся части потока, перебирая элементы списка подходящих оценщиков
в запросе. Каждое сообщение-запрос направляется новому оценщику, в новую
точку назначения. В примере 9.2 показано, как можно задать URL оценщика.
OutputLocalEnvironment.Destination.HTTP.RequestURL =
InputRoot.MRM.soap11:Body.fl3:requestAssessorAvailability.fl3:assessorL
ist.fl3:assessors[assessorCount].fl3:assessorURL;
В параметрах вычислительного узла Fan Out должно быть указано распространение
папки LocalEnvironment, а также обычный параметр распространения дерева сообщений.
Также должна быть строчка кода (пример 9.3), копирующая папку
LocalEnvironment, которая была получена от узла Aggregate Control.
-- Для узла агрегации необходима следующая инструкция
SET OutputLocalEnvironment = InputLocalEnvironment;
MQOut Assessor
7. Узел MQOut Assessor, по сути, посылает сообщение WebSphere MQ в очередь оценщика.
Сообщение никуда не посылается, но в папке LocalEnvironment создается
папка Written Destination, которая используется узлом Aggregate Request для задания
корреляционной информации для агрегации.
Мы извлекли сгенерированный идентификатор сообщения (MsgID) из папки Written
Destination, чтобы убедиться в том, что он идентичен тому, который был сохранен
узлом Aggregation Request. У нас были определенные проблемы при сохранении нашего
собственного MsgID в MQMD и при включении опции узла MQOut, запрещающей
генерацию нового MsgID. Казалось, что он не совпадает с тем, который указан
в таблице узла Aggregation Request. Чтобы быть уверенными в том, что скрытый
MsgId, сохраненный узлом Aggregation Request, идентичен тому, который мы сохранили
в таблице CLAIMSASSESSOR, мы сохранили MsgID из папки Written Destination.
Таким образом, мы можем быть абсолютно уверены в том, что мы сохраняем тот же
MsgID, что и в узле Aggregation Request. Мы так и не смогли выяснить, почему ошибки
были связаны с MsgID, но формирование потока с использованием папки Written
Destination устранило возможность возникновения проблемы.
AggregateRequest
8. Все, что мы предоставили для узла Aggregate Request – это имя папки, которая долж-
на быть создана для хранения объединенного сообщения-ответа (пример 9.4).
InputRoot.comIbmAggregateReply.<имя папки>
Все наши сообщения-запросы используют папку с этим именем, поэтому индивидуальные
сообщения-ответы помечаются данным именем папки в агрегированном
сообщении-ответе.
Save AssessorRequest
9. Узел Save AssessorRequest сохраняет MsgId (= ReplyIdentifier) в папке WrittenDestination,
в базе данных ClaimsAssessor, в форме поля CorrelId, с указанием для него
значений ClaimID и AssessorID. Это значение для каждого ответа восстанавливается
в поле MQMD.CorrelId, когда ответ попадает в поток 3а (пример 9.5).
INSERT INTO Database.EMERGE.CLAIMASSESSOR (
claimID, assessorID, assessorURL,location, reqdate, makeofcar,
registration,replytoq, replytoqmgr, correlid) VALUES (
InputRoot.MRM.soap11:Body.fl7:requestAssessorAvailability.fl7:
claimID,
InputRoot.MRM.soap11:Body.fl7:requestAssessorAvailability.fl7:
assessorID,
InputLocalEnvironment.Destination.HTTP.RequestURL,
InputRoot.MRM.soap11:Body.fl7:requestAssessorAvailability.fl7:location,
InputRoot.MRM.soap11:Body.fl7:requestAssessorAvailability.fl7:reqDate,
InputRoot.MRM.soap11:Body.fl7:requestAssessorAvailability.fl7:cardet.
fl7:makeOfCar,
InputRoot.MRM.soap11:Body.fl7:requestAssessorAvailability.fl7:cardet.
fl7:registration,
'NoReplytoQ',
'NoReplytoQmgr',
InputLocalEnvironment.WrittenDestination.MQ.DestinationData.msgId);
SOAP/HTTP Assessor
10. И наконец, каждое сообщение-запрос посылается оценщику. Если бы мы поддерживали
несколько типов соединений, мы бы использовали узел RouteToLabel для
выбора выходного узла.
Поток 3а
Поток 3а получает управление от потока 4а, который реализует для оценщиков службу
возврата данных о готовности.
Подготовка
1. Узел TryCatch определяет контекст обработки исключений для
оставшейся части процесса, который является клиентом процесса
ExternalClaimsAssessor.
2. Узел Update CLAIMASSESSOR обновляет базу данных, записывая в нее
информацию, полученную от каждого оценщика, исключительно для целей
аудита. Сохраненная информация нигде в нашем сценарии не
используется.
3. Узел Prepare Reply очищает всю информацию HTTP/SOAP из папок
брокера и фактически создает сообщение-запрос, включив в нее всю
информацию ответа оценщика для передачи ее в узел MQReply. Делается
это для того, чтобы казалось, будто бы все время велась обработка
сообщения MQ Request, без передачи его через HTTP.
4. Узел MQReply AggIn помещает ответ в очередь AggIn reply и
использует значение опции MQMD для копирования MsgID (который сейчас
представляет собой исходное значение ReplyIdentifier) в поле
CorrelId.
Возможно, сработал бы вариант без создания реального сообщения-ответа
WebSphere MQ, с простой передачей правильно сформированных папок в узел
AggregateReply. У нас возникали некоторые проблемы при попытках обеспечить правильную
работу агрегации, поэтому мы не пытались проводить данную оптимизацию.
MQInput AggIn
5. Узел MQInput AggIn получает сообщение-ответ из очереди AggIn и передает его
узлу AggregateReply.
MQInput Control
6. Узел MQInput Control получает управляющее сообщение на FLOW3A.CONTROLQ
и передает его в узел AggregateReply.
Aggregate Reply
7. Узел Aggregate Reply формирует объединенное сообщение-ответ в папке, указанной
узлом Aggregate Request. Как уже обсуждалось ранее, работает два таймера.
Таймер Unknown направляет опоздавшие ответы на терминал нераспознанных
сообщений. Таймер Timeout отправляет неготовое объединенное сообщение на
терминал Timeout. На схеме оба таймера направляют сообщения к узлам трассировки.
На практике нам нужно создать сообщение-запрос, идущее к процессу
ExternalClaimAssessors либо от выходного терминала, либо от терминала Timeout.
Generate Output3a
Узел Generate Output3a конструирует сообщение-запрос, используя папку
объединенного запроса, созданную узлом AggregateReply.
9.4 Реализация наборов сообщений
Для создания наборов сообщений, содержащих определения сообщений для всех
интерфейсов, перечисленных в табл. 9.1, нам нужно выполнить шесть шагов:
Преобразовать WSDL-определения сообщений в схемы.
Создать проект набора сообщений.
Создать набор сообщений.
Импортировать схему интерфейсов.
Преобразовать схемы в определения сообщений.
Настроить определения сообщений для создания SOAP-конвертов
9.4.1 Преобразование сообщений из wsdl-файлов в схемы
WebSphere Studio Application Development Integration Edition или Rational Software
Architect – это самые лучшие инструменты для преобразования WSDL-файлов в схемы,
поскольку оба эти инструмента имеют специализированный WSDL-редактор
и редактор схем. WebSphere Business Integration Message Broker содержит только
редактор схем.
В WebSphere Studio Application Development Integration Edition создайте новые файлы
схем для каждого WSDL-файла, который нужно преобразовать.Создавайте файлы схем с теми же именами, но с расширениями .xsd. Существует
мастер, который поможет вам это сделать. Выберите пункт меню File (Файл) $$\to$$ XML $$\to$$ XML Schema. Присвойте схеме имя и нажмите Finish (Готово)
(рис 9.14).
(рис 9.14) Создание нового файла схемы в Integration EditionСохраните файлы в директории с именем wsdl. На рис 9.15 показано дерево
проектов в WebSphere Studio Application Development Integration Edition
с несколькими файлами WSDL и .xsd.
(рис 9.15) Некоторые из файлов схем и WSDL в проекте
Существует два типа WSDL-файлов. Часть имеет встроенные полные определения
сообщений, а часть ссылается на схему Businessitems.xsd. Проще всего начать
с файлов с полными определениями сообщений. После их конвертирования становится
понятно, как следует редактировать оставшиеся файлы:Возьмем в качестве примера файл AssessorAvailability(3).wsdl и скопируем все,
что находится между тегами <wsdl:types> и <\wsdl:types>. Откройте файл
AssessorAvailability(3).xsd, выделите все начиная с <schema ... и по <\schema>
(пример 9.6) и замените эти данные скопированными определениями.<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.ibm.com"
xmlns:test="http://www.ibm.com">
</schema>
Файл должен сохраниться без ошибок. В качестве дополнительного задания,
приведите в порядок выражение schema и оставшуюся часть файла (первая
часть файла схемы показана в примере 9.7):<?xml version="1.0" encoding="UTF-8"?>
<schema elementFormDefault="qualified"
targetNamespace="http://broker.lgi.itso.assessavail"
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:intf="http://broker.lgi.itso.assessavail" >
<element name="requestAssessorAvailability">
<complexType>
<sequence>
<element name="claimID" nillable="true" type="int" />
<element name="location" nillable="true" type="string" />
<element name="responseTime" nillable="true" type="string" />
<element name="requiredDate" nillable="true" type="string" />
<element name="makeOfCar" nillable="true" type="string" />
<element name="assessorList" nillable="true"
type="intf:AssessorList" />
</sequence>
</complexType>
</element>
... продолжение ...
были удалены дублирующиеся пространства имен;
поскольку http://www.w3.org/2001/XMLSchema является пространством имен по умолчанию, все префиксы xsd: можно удалить;
убедитесь, что целевое пространство имен уникально в пределах набора сообщений и совпадает с пространством имен, ассоциированным с префиксом, применяемым для всех встроенных сложных типов.
Внимание! Мы предлагаем, чтобы при импортировании схемы в MRM брокера в каждом
создаваемом вами файле схемы был свой префикс целевого пространства имен. Мы
использовали префиксы flxx, где хх – номер потока. Изменение префикса не влияет на
семантику схемы, но позволяет повысить удобство чтения и избежать путаницы.
Лучший способ избежать проблем с именами – это управлять пространствами имен и
определениями типов на всем протяжении интеграционного пространства, но такое во многих
случаях просто невозможно по организационным и историческим причинам. В данном проекте
у нас есть несколько конфликтов имен, отражающих проблемы реального мира, и мы решаем
задачу по устранению этих конфликтов.С точки зрения программной инженерии важная цель – получить только один именованный тип
для каждого типа данных, т. е. избежать дублирования определений, которые являются
источниками ошибок, если определения отличаются друг от друга. Если этой цели нельзя
достигнуть без проблем, то можно использовать другую, не столь сильную, но более
достижимую цель – помещать все дублирующиеся типы в разные пространства имен.
Обеспечьте наличие для разных разработчиков и групп разработчиков корневого пространства
имен, в котором определяются уникальные имена пространств имен и осуществляется
управление их типами.
Экспортируйте файлы схем в виде zip-файла или в форме файловой системы, готовой к импортированию в брокер.
9.4.2 Создание проекта набора сообщений
Каждый проект набора сообщений может содержать только один набор сообщений.
В каждом наборе сообщений хранится несколько определений сообщений. Каждому
определению сообщения соответствует один файл схемы. Одна и та же схема может
использоваться в разных определениях сообщений, и в один файл схемы можно собирать
множество элементов.
Сколько же проектов наборов сообщений нам нужно создать для хранения всех
нужных нам наборов сообщений? Мы можем поместить все определения в один набор
и можем помещать каждое определение в свой собственный набор сообщений.
Как правило, лучше всего, если все определения сообщений находятся в одном
наборе сообщений. Так ими будет проще управлять, а при наличии большого числа
определений набор сообщений будет проще создать. С точки зрения программной
инженерии это позволяет многократно использовать сложные типы, что уменьшает
вероятность ошибки. Однако наряду с этими преимуществами возникает необходимость
в организованном создании типов и сообщений. Дублирование типов и сообщений
в одном наборе будет приводить к ошибкам, даже если эти типы и сообщения
находятся в разных пространствах имен.
(рис 9.16) Организация наборов сообщения в брокереС точки зрения управления проектом добиться такой организованности может
быть весьма сложно, в особенности в проектах интеграции приложений, где вы не
имеете контроля над именами частей системы. Поэтому брокер предоставляет нам
возможность применять несколько наборов сообщений и проектов без совместного
использования одних элементов в разных наборах.
Части, относящиеся к разным наборам, могут вместе применяться в одном потоке,
но ответственность за правильный подбор и использование частей лежит на разработчиках
потоков сообщений.
В случае с проектом ExternalClaimAssessors эти части не проектировались как
единое целое, и поэтому существуют дублирующиеся сложные типы и имена сообщений.
Кроме того, используемая нами практика, когда все WSDL-файлы являются
независимыми, означает, что мы должны импортировать в брокер дубликаты типов.
Поэтому мы не можем просто создать все определения сообщений в одном наборе
сообщений. Нам нужно было принимать решение. Мы могли вернуться назад и изменить
определения, рационализировав имена и сделав более общими типы, или же мы
могли создать несколько разных потоков сообщений.
Как правило, возвращаться назад и менять определения сообщений в WSDL-файлах
довольно сложно. Существует множество зависимостей, которые следует учитывать,
включая полную переработку связей с партнерами, исправление WSDL-определений
для средств трансформации и (если используются такие программы, как EJB)
повторную генерацию EJB по новым WSDL-определениям с копированием пользовательского
кода из старого EJB в новый EJB. Кроме того, следует учитывать вероятность
внесения ошибок при выполнении этих задач.
На практике в ходе интеграции корпоративных приложений лучше всего свести
к минимуму переработку имеющегося кода, а для связывания частей использовать
возможности интеграционных серверов, таких, как WebSphere Business Integration
Message Broker.
Мы исходно намеревались определить несколько наборов сообщений, что позволило
бы избежать конфликтов имен и типов при импортировании схем в брокер.
В табл. 9.8 показано, как мы распределили определения сообщений.
Наборы сообщений и определения
| .xsd |
Проект набора сообщений |
Набор сообщений |
| AssessorAvailability(3) AssessorAvailability(3a) |
AssessorAvailability 3 и 3a |
3 и 3a |
| AssessorAvailability(4) AssessorAvailability(4a) |
AssessorAvailability 4 и 4a |
4 и 4a |
| AllocateAssessment(6) AllocateAssessment(6a) |
AllocateAssessment 6 и 6a |
6 и 6a |
| AssessorReport(7) AssessorReport(7a) |
AssessorReport 7 и 7a |
7 и 7a |
| AssessorReport(8) AssessorReport(9) |
AssessorReport 8 и 9 |
8 и 9 |
Все шло прекрасно, пока мы не начали писать код ESQL. Мы обнаружили, что, хотя
компилятор ESQL нормально воспринимал использование нескольких наборов сообщений,
в функции автоматического выполнения имелась проблема, в основном
объясняющаяся тем, что на все наши типы ссылалось одно сообщение SOAP-конверт.
Функция автоматического выполнения могла предлагать специализированные элементы
Body из одного набора сообщений. Вообще-то мы могли бы продолжать и без
правильно работающей функции автоматического выполнения, используя несколько
наборов сообщений для разрешения конфликтов имен и типов. Мы приняли решение
учесть все это, разрешить конфликты имен и использовать один набор сообщений.
Мы ожидаем, что версия 6 WebSphere Business Integration Message Broker будет
содержать усовершенствования, улучшающие его работу в данной области, что сделало
бы подход с несколькими наборами сообщений более предпочтительным.
Теперь наша цель – разрешить конфликты имен, возникающие из-за использования
одного набора сообщений в WebSphere Business Integration Message Broker без
изменения WSDL-определений Web-служб.
Совет. По умолчанию брокер сохраняет свое рабочее пространство в инсталляционной
директории. Чтобы работать с несколькими рабочими пространствами и хранить их в папке
My Documents, чтобы они архивировались программами, которые исключают папки ...\Program
Files\... , измените ярлык вызова рабочего места, указав параметр –data:"C:\Program Files\IBM\WebSphere Business Integration Message Brokers\eclipse\mqsistudio.exe" -
data "C:\Documents and Settings\Administrator\My Documents\ITSO\SA-H414\In work\Code\Final
tested files\wbimb\workspace"
Осторожно! Создается длинный путь к файлу. Позже вы увидите, что это приводит к тому, что
в рабочем месте начинают возникать труднопредсказуемые ошибки. Позже в этой лекции вы
найдете еще два совета, которые подскажут вам, как можно продолжать сохранять рабочие
пространства в папке My Documents, не испытывая проблем, связанных с длинными именами
файлов.
Создайте один проект набора сообщений с именем Assessor Messageset.
Откройте инструментарий брокера и выберите перспективу Broker Application Development (Разработка приложений брокера).
Выберите пункт меню File (Файл) $$\to$$ New (Новый) $$\to$$ Message Set Project (Проект набора сообщений). Введите имя Assessor Messageset, нажмите Next (Далее) и Finish (Готово).
Вы можете сразу создать и набор сообщений. Мы будем использовать другой мастер (рис 9.17).
(рис 9.17) Создание нового проекта набора сообщений
9.4.3 Создание набора сообщений
После создания проекта набора сообщений создайте набор сообщений, который будет
содержать все определения сообщений.
Щелкните правой кнопкой мыши по проекту набора сообщений, выберите пункт
меню New (Новый) $$\to$$ Message Set (Набор сообщений) и введите имя набора сообщений
proxyAssessorMessages:Установите флажок Use namespaces (Использовать пространства имен) и нажмите Next (Далее) (рис 9.18).
(рис 9.18) Флажок Use namespaces (Использовать пространства имен)
Установите флажок ).
(рис 9.19) Флажок XML Wire Format Name (Имя формата XML Wire)
Здесь вы можете изменить имя формата XML Wire, но мы оставили в этом поле
значение XML1. Это имя ассоциируется с форматом передачи данных XML, который
используется для всех определений сообщений, входящих в набор сообщений. Это
имя формата должно использоваться везде и должно совпадать с именем формата во
входящем сообщении (если оно указано). Очень легко проглядеть несовпадение
имен форматов в сообщениях, а это не даст потоку работать. Формат XML Wire можно
настраивать, и мы увидим это позже. Настроенный формат должен быть идентичен
для всех определений сообщений, входящих в набор сообщений.
(рис 9.20) Свойства набора сообщенийТеперь новый набор сообщений создан, и на экране отображается файл messageSet.
mset.
Укажите в поле Default Wire Format (Формат передачи XML по умолчанию) значение XML1 (формат по умолчанию используется, если формат не указан во входящем сообщении или во входном узле потока сообщений).
В разделе Properties Hierarchy (Иерархия свойств) файла messageSet.mset раскройте пункт Physical properties (Физические свойства) $$\to$$ XML1.
В разделе Details (Подробно) файла messageSet.mset:Установите флажок Suppress doctype (Не использовать типы документов). Объявления DTD не нужны. Система основывается на схемах, а не на DTD.
Очистите поле Root Tag Name (Имя корневого тега).
Мы используем SOAP-сообщения, где имя корневого тега должно быть Envelope.
Также система потенциально может применять встроенные сообщения. Неразумно
применять жестко определенное имя корневого тега при использовании встроенных
сообщений.
(рис 9.21) Настройка генерации XML
9.4.4 Импортирование схем в брокер
Далее импортируйте файлы схем в рабочее пространство инструментария Broker
Toolkit. Вы можете организовать импорт схем, поместив файлы схем, относящиеся
к каждому проекту набора сообщений, в соответствующий проект, или же можно
импортировать все схемы в общую папку.
В перспективе Broker Application Development перейдите в окно Resource Navigator
(Навигатор ресурсов), щелкните правой кнопкой мыши по элементу proxyAssessorSystem и выберите пункт меню File (Файл) $$\to$$ Import (Импорт) $$\to$$ File system (Файловая система) $$\to$$ Next (Далее):Перейдите к директории, в которой находятся файлы схем, и отметьте файлы,
которые вы хотите импортировать.
В качестве пункта назначения для импортированных ресурсов уже должна
быть указана система proxyAssessorSystem. Установите флажок Create
selected folders only (Создавать только указанные папки) и нажмите Finish
(Готово).
Проверьте схемы, открыв и изучив их графическое представление и сравнив их
с исходными WSDL-файлами (рис 9.22).
Используя представление Outline (Общий обзор), выберите схему верхнего уровня
или выберите верхний уровень на графической закладке. Затем откройте закладку
Design редактора свойств и убедитесь, что в поле целевого пространства
имен указано нужное вам пространство.
Последнее, что нужно импортировать, – это файл схемы, который описывает
SOAP-сообщения. При помощи Web-браузера посетите сайт World Wide Web
Consortium (W3C):
http://schemas.xmlsoap.org/soap/envelope/
Сохраните схему для SOAP 1.1.
(рис 9.22) Схема RequestAssessorAvailablity
9.4.5 Использование схем для создания MDF
Теперь, когда все наши файлы схем находятся в рабочем пространстве Broker Toolkit,
мы можем использовать их для заполнения файлов определений сообщений (message
definition file, MDF).
В перспективе Broker Application Development, в окне Resource Navigator (Навигатор
ресурсов), щелкните правой кнопкой мыши по файлу схемы, который вы хотите
использовать в качестве источника определений сообщений. Выберите пункт
меню New (Новый) $$\to$$ Message Definition File (Файл определения сообщений).
Переключатель XML schema file (Файл XML-схемы) должен быть включен. Нажмите Next (Далее). Выберите применяемый файл схемы и нажмите Next (Далее).
Выберите проект Assessor Messageset, который вы создали, и нажмите Next (Далее).
Установите флажки выбора глобальных элементов и нажмите Finish (Готово).
Вы создали новый файл определений сообщений (.mxsd). Повторите данные шаги
для каждого файла схемы. Вы должны получить 10 сообщений об ошибках, связанных
с конфликтом имен (рис 9.23).
(рис 9.23) Ошибки при импортировании определений сообщений в один набор сообщенийУстранение дубликатов имен и типов
Легче всего устранить шесть ошибок, помеченных буквами А. Эти ошибки вызваны
тем, что поток 3 и поток 4 используют одинаковые имена сообщений. Высокоуровневые
элементы сообщения применять необязательно, поскольку в действительности
мы будем использовать сообщение-конверт SOAP (SOAP envelope).
Оставшиеся четыре ошибки вызваны дубликатами типов CarDetails и AssessorAckMessage
в одном пространстве имен. В данном случае нам повезло. Это полные
дубликаты, и мы можем удалить один из дублей, заменив его ссылкой. Если бы типы
имели одинаковые имена и пространства имен, но при этом различались, то у нас
было бы только два варианта: заставить одну из команд разработки изменить определения
в исходных материалах и внести изменения везде, где изменения определений
на что-то повлияли, или использовать несколько наборов сообщений для хранения
конфликтующих типов.
Решение проблемы дублирования имен сообщений
Эта ошибка, возникающая, даже если сообщения находятся в разных пространствах
имен, вызвана тем, что версия 5 WebSphere Business Integration Message Broker не использует
в данной ситуации пространства имен для различения сообщений. Возможно,
это будет исправлено в версии 6.
Для решения проблемы дублирования имен сообщений, выполните следующие
действия:
(рис 9.24) Удаление дубликатов сообщенийОткройте файл определений сообщений AssessorAvailablity(3) и выберите папку Messages. На рис 9.24 мы используем для этого представление Outline (Общий обзор).
Удалите сообщения requestAssessorAvailablity и requestAssessorAvailabilityReponse и сохраните файл определений.
Число ошибок уменьшится до четырех.
Решение проблемы дублирования типов
Эта процедура несколько более хитрая. Проблема показана на рис 9.25.
(рис 9.25) Конфликт типовТип AssessorAckMessage в пространстве имен itso.lgi.broker имеет дубликаты, которые
обведены на левой половине рисунка. Тип CarDetails дублируется в пространстве
имен itso.assessor, как показано в правой части. Обратите внимание, что в пространстве
имен itso.assessor есть дубликат типа AssessorAckMessage, но это не представляет
проблемы, поскольку этот дубль находится в другом пространстве имен.
Важно! Если разница пространств имен позволяет нам дублировать определение
AssessorAckMessage, это не означает, что наш код понятен. Сами определения или их смысл
могут быть иными. Однако такая ситуация обычна при интеграции корпоративных приложений.
Не делайте никаких допущений. Эти структуры и их определения могут происходить из разных
организаций или отражать разные версии. На имена и пространства имен не всегда можно
полагаться.
Мы удалим тип AssessorAckMessage из AssessorReport(8) и заменим его ссылкой на
определение в DeliverAssessment(7).
Откройте в представлении ).
(рис 9.26) Тип AssessorAckMessage в сообщении AssessReport(8)
Удалите тип и нажмите OK в появляющемся сообщении для подтверждения удаления элемента receiveAssessorReportReturn.
Выделите сообщение receiveAssessorReportResponse, щелкните правой кнопкой мыши и выберите пункт меню Add Local Element (Добавить локальный элемент). Введите значение receiveAssessorReportReturn, чтобы восстановить элемент.
Новый элемент отобразится в окне редактора определения сообщения. Выберите string в столбце Type (Тип), а в раскрывающемся списке выберите More (Еще).
Выберите тип показано восстановленное сообщение-ответ.
(рис 9.27) Заново созданное сообщение-ответ receiveAssessorReportResponse
Используя сходную процедуру, удалите одно из определений CarDetails.
Удалите тип CarDetails. Нажмите OK в предупреждающем сообщении.
Откройте элемент requestAssessorAvailability в редакторе определения сообщения. Щелкните правой кнопкой мыши по элементу ** Anonymous **, выберите пункт меню Add Local Element и введите имя cardet.
Укажите тип (рис 9.28) Определение и ссылка на определение CarDetails в сообщении Availability(4)
Перетащите элемент .
(рис 9.29) Заново созданный элемент requestAssessorAvailability
Сохраните файл определений сообщений. Теперь все ошибки должны быть исправлены.
9.4.6 Настройка SOAP MDF (soap11.mxsd)
У нас есть несколько вариантов определения конверта SOAP, в который заключаются
схемы сообщений.
Добавить необходимые SOAP-теги для обработки входящих сообщений и создать исходящие сообщения, используя знание спецификации SOAP без воссоздания правил и ограничений для правильно сформированных SOAP-сообщений.
Использовать импортированную нами SOAP-схему для определения SOAP-сообщений. Мы можем применять эту схему для проверки правильности входящих SOAP-сообщений и для обеспечения правильного формирования наших собственных SOAP-сообщений.
Для файла определения сообщений, созданного при помощи сданной схемы, будут
выводиться предупреждения, поскольку модель сообщений MRM не полностью
совпадает с XML-схемами. Мы можем решить эту проблему несколькими способами:
Игнорировать предупреждения. В представлении Tasks (Задачи) есть параметр фильтра, позволяющий удалять какие-то предупреждения из задач или все предупреждения.
Стереть исходный файл схемы, удалив причину предупреждений.
Отредактировать файл определения сообщения, используя редактор брокера, и усовершенствовать проверки с использованием модели сообщений MRM на основе редактирования SOAP-спецификации, дополнив правила, указанные в определении схемы.
Мы выбрали вариант "с" – с редактированием файла определения сообщения для
улучшения проверки SOAP-сообщений. Нужно выполнить два следующих действия:
Создать файл определения SOAP-сообщения из SOAP-схемы.
Изменить определение схемы SOAP-сообщения, чтобы избавиться от предупреждений и "улучшить" проверку.
Создание файла определения SOAP-сообщения
Схема SOAP 1.1 будет вызывать ошибку при преобразовании в файл определения сообщений;
поэтому, прежде чем продолжить, нам нужно изменить ее. Брокер не поддерживает
атрибуты списков. Откройте импортированную схему SOAP 1.1 в редакторе
схем брокера, переключитесь на представление Source (Исходный код) и внесите
изменения в соответствии с примером 9.8.
Строка (<xs:list ... >) блокируется символом
комментария и добавляются строки, начинающиеся с (<xs:restr ... >).
<xs:simpleType name="encodingStyle">
<xs:annotation>
<xs:documentation>'encodingStyle' indicates any canonicalization
conventions followed in the contents of the containing element. For
example, the value 'http://schemas.xmlsoap.org/soap/encoding/'
indicates the pattern described in SOAP specification
</xs:documentation>
</xs:annotation>
<!-- <xs:list itemType="xs:anyURI" /> -->
<xs:restriction base='xs:string'>
<xs:pattern value='http://schemas.xmlsoap.org/soap/encoding%' />
</xs:restriction>
</xs:simpleType>
Создайте новый файл определения сообщения в проекте Assessor Messageset, преобразовав
измененную схему SOAP 1.1. Назовите это определение сообщения SOAP11.
Вы увидите 13 предупреждений.
Примечание. Из файла SOAP.xsd используйте только глобальный элемент Envelope, по
которому создается сообщение. Делается это для того, чтобы потоки сообщений могли
распознать это сообщение как обрабатываемое. Оставьте опции Header, Body и Fault
неотмеченными, как показано на рис 9.30.
(рис 9.30) Выбор из SOAP-схемы только конверта
Создание SOAP-оболочки для сообщений
С помощью редактора файла определений сообщений внесите описанные ниже
правки, что позволит избавиться от предупреждений и сжать проверку корректности
SOAP-сообщений.
Удалите элементы Wildcard из элементов .
Удалите атрибут Wildcard из элемента Body.
Удалите пространства имен из трех оставшихся атрибутов Wildcard, показанных на рис 9.31. Для этого выделяйте каждый атрибут по очереди и открывайте закладку Properties (Свойства) вместо закладки Overview (Обзор) в редакторе определений сообщений (рис 9.32).
(рис 9.32) Элементы, которые нужно отредактировать в схеме SOAP 1.1(рис 9.31) Удаление пространства имен из атрибутов WildcardСовет. Быстрее всего будет использовать представление Outline для выбора атрибутов, а затем
вам нужно один раз перейти на закладку Properties (Свойства).
Установите в поле Content Validation (Проверка содержимого) для сложного
типа Envelope значение OpenDefined (изначально там указано значение Closed )
(рис 9.33). Это означает, что потомками типа Envelope могут быть только атрибуты,
определенные в данном наборе сообщений. Явными потомками его являются (рис 9.33) Параметр Content validation для сложного типа Envelope устанавливается в Open Defined
Установите в поле Content Validation (Проверка содержимого) для сложных типов Header и Detail значение Open (вместо установленного там Closed). Это
означает, что здесь допустимо использовать любые атрибуты. Заголовки SOAP не
являются обязательными, поэтому значение Min Occurs (Минимальное число
вхождений) можно установить равным нулю, но такое значение не поддерживается в MRM, поэтому мы оставим значение 1.
Укажите в поле Complex type (Сложный тип) элемента Body вариант Composition,
а в поле Content Validation (Проверка содержимого) – значение OpenDefined. Это позволит использовать в качестве потомка элемента Body любой
из элементов импортированной схемы, но не элементы, отсутствующие в схеме.
Удалите шаблон (pattern facet) глобального атрибута mustUnderstand, поскольку
он не является необходимым, и его удаление устраняет предупреждение, выдаваемое
инструментарием Broker Toolkit (рис 9.34).
(рис 9.34) Удаление шаблона из атрибута mustUnderstandПримечание. Данный шаблон представляет собой определение того, какие значения может
принимать переменная. Булев тип имеет шаблон 0|1, что делает его похожим на перечислимый
тип.
Добавьте в схему SOAP элемент Fault как потомок элемента Body. Для этого выделите
элемент Body, щелкните правой кнопкой мыши и выберите пункт меню Add
element reference (Добавить ссылку на элемент) (рис 9.35).
(рис 9.35) Добавление ссылки на элемент в элемент Body
Прокрутите список до элемента ).
(рис 9.36) Выбор ссылки на элемент Fault
В том же окне укажите для элемента Fault в поле Min Occurs (Минимальное число вхождений) значение 0 и сохраните изменения. Вы увидите, что все предупреждения исчезли.
Выполнив данные шаги, мы создали SOAP-оболочку для наших сообщений. Теперь
нам нужно ввести сообщения в эту оболочку.
9.4.7 Создание SOAP-сообщений
При наличии SOAP-оболочки нам нужно выполнить еще пару шагов, чтобы завершить
создание SOAP-сообщений в брокере:
Сохранить SOAP-оболочку для последующего использования, чтобы не приходилось проходить процедуру редактирования заново.
Ввести сообщения Assessor в поле Body оболочки SOAP.
Сохранение оболочки SOAP
Мы экспортируем оболочку SOAP в виде файла XML-схемы, и ее можно будет
использовать в других проектах наборов сообщений в будущем.
Выберите файл определения сообщения SOAP11.mxsd в навигаторе ресурсов,
выберите пункт меню New (Новая) $$\to$$ XML Schema (XML-схема). Выберите wire-формат XML1 и убедитесь в том, что файл SOAP11.mxsd выделен. Выберите пункт Strict Generation (Точная генерация) $$\to$$ Next (Далее), создайте новую папку для
хранения XML-схемы (например, Generated) и нажмите Finish (Готово).
Внимание! Сложный тип Header, созданный при импорте исправленного файла SOAP11.xsd,
имеет в поле Content Validation (Проверка содержимого) значение Closed. Укажите здесь
значение Open. Также исправьте данный параметр в трех других типах. Предупреждения
исчезнут, когда вы сохраните файл.
Преобразование сообщений Assessor в SOAP-сообщения
Последняя задача в создании набора сообщений – это объединение определения
SOAP с каждым из 10 сообщений Assessor. Мы сделаем это путем импортирования
файлов определений сообщений Assessor в файлы определений SOAP-сообщений,
а затем сделаем сообщения Assessor потомками элементов Body SOAP-сообщения.
Начнем с определения сообщения AllocateAssessment(6).
Импортируйте файлы определений сообщений (MDF), представляющие службы
Assessor в SOAP MDF:Выделите файл SOAP11.mxsd в навигаторе ресурсов и перейдите на закладку
Properties (Свойства) редактора определений сообщений, как показано
на рис 9.37.
(рис 9.37) Импорт сообщений Assessor в SOAP-сообщение
Щелкните правой кнопкой мыши по пункту Imports (Импорты) $$\to$$ Add (Добавить),
выделите файл определения сообщения (рис 9.38) Импортирование определения сообщения Assessor в определение сообщения SOAP
Повторите эту операцию для всех файлов определений сообщений, как показано на рис 9.39.
(рис 9.39) Все импортированные файлы определений сообщений
Теперь, когда мы можем ссылаться в SOAP MDF на сообщения Assessor данного
проекта, добавим глобальные элементы сообщений Assessor в качестве потомков
в элемент SOAP Body:При выделенном файле определения SOAP11.mxsd откройте закладку Overview
(Общий обзор) и раскройте структуру .
(рис 9.40) Добавление элементов Assessor в качестве потомков в элемент Body и задание параметра Min Occurs
Щелкните правой кнопкой мыши по элементу Body, выберите пункт меню Add Element Reference (Добавить ссылку на элемент) и добавьте все элементы.
Укажите для параметра minOccurs (Минимальное число вхождений) каждой из структур значение 0, поскольку ни одна из них не является обязательной.
Повторите процедуру для остальных 16 элементов верхнего уровня, как показано
на рис 9.41 и 9.42.

(рис 9.42) Все 17 сообщений Assessor в оболочке(рис 9.41) Проверка источника, на который ссылается элементСовет. Размещение всех этих ссылок в оболочке SOAP сложно выполнить правильно, поэтому
нужно все тщательно проверять.
Сложно связать имена в ссылках на элементы с именами элементов:Префиксы, которые мы добавили для различения сообщений, были урезаны, префиксы дублирующихся пространств имен – потеряны.
Нет квалификаторов пространств имен, которые помогли бы выбрать правильный элемент. Лучше всего щелкнуть один раз правой кнопкой мыши по вставленной ссылке на элемент, выбрать пункт меню Go To Declaration (Перейти к объявлению) и убедиться в том, что ссылка указывает на нужный элемент (рис. 9.42).
Ведите работу систематически. Мы добавляли ссылки в том порядке, в котором идут потоки, придерживаясь вида, показанного на рис. 9.11 и 9.12.
В конце подсчитайте количество ссылок. Их 17. Это число должно совпадать с числом определений элементов. Три потока представляют собой односторонние SOAP-сообщения, поэтому число интерфейсов в них меньше в два-три раза.
Проверьте, чтобы не было дублирующихся ссылок.
Убедитесь в том, что все ссылки являются потомками элемента Body и ни один из них не был записан к другому предку.
Убедитесь в том, что все значения Min Occurs равны нулю. Все эти элементы необязательные.
9.5 Реализация таблиц баз данных
База данных с этими таблицами должна располагаться на машине SAH414A, локальной
для брокера сообщений. Сначала создадим на SAH414A базу данных и схему, затем
создадим таблицы и, наконец, импортируем схемы и таблицы в рабочее место
WebSphere Business Integration Message Broker, чтобы их можно было использовать
в потоках сообщений.
9.5.1 Создание базы данных Assessor
Чтобы создать базу данных Assessor, выполните следующие шаги:
Запустите центр управления DB/2 на SAH414A. Запустите мастер создания баз данных, как показано на рис 9.43.
(рис 9.43) Мастер создания баз данных
Назовите базу данных ASSESSOR (рис 9.44).
(рис 9.44) Создание базы данных ASSESSOR
Поскольку объем реальной памяти для SAH414A ограничен, мы настроили использование
памяти базой ASSESSOR (рис 9.45).
(рис 9.45) Уменьшение памяти для базы данных
9.5.2 Создание схемы и таблиц
Выполните следующие шаги для создания схемы и связанных с ней таблиц.
С помощью центра управления DB/2 создайте новую схему и назовите ее EMERGE (рис 9.46).
(рис 9.46) Создание схемы EMERGE
Щелкните правой кнопкой мыши по папке Tables (Таблицы), выберите пункт меню
Create (Создать), укажите схеме EMERGE и назовите новую таблицу
CLAIMASSESSOR (рис 9.47).
(рис 9.47) Создание таблицы CLAIMASSESSOR
Используя данные, приведенные в таблица 9.5).
(рис 9.48) Создание столбцов в таблице CLAIMASSESSOR
Определите два ключевых поля, назвав ограничение CA1 (рис 9.49).
(рис 9.49) Определение ключей для CLAIMASSESSOR
Повторите процесс, используя данные в таблица 9.6).
(рис 9.50) Таблица ACTIONASSESSOR
Таблица RESOLVEASSESSOR показана на рис 9.51.
(рис 9.51) Таблица RESOLVEASSESSOR
9.5.3 Соединение базы данных с рабочим местом брокера
Чтобы присоединить базу данных, выполните следующие шаги:
Откройте из рабочего места перспективу Data (Данные) и щелкните правой кнопкой
мыши в представлении DB Servers (Серверы БД). Выберите пункт меню New
Connectio n (Новое соединение) (рис 9.52).
(рис 9.52) Новое соединение с базой данных в Workbench
Заполните форму, как показано на рис 9.53.
(рис 9.53) Определение соединения с базой данных
Импортирование базы данных в проекты брокера сообщений
Создав соединение между рабочим местом и базой данных ASSESSOR, мы хотим создавать
схемы и таблицы прямо из рабочего места. Для этого нам нужно импортировать
соединение с базой данных в проект в рабочем месте, который мы будем использовать
для разработки таблиц.
Создайте проект потока сообщений (Message Flow) с именем ASSESSOR database.
Мы обнаружили, что размещение определения базы данных в простом проекте
приводит к появлению предупреждений, связанных с неидентифицируемыми сообщениями.
Если разместить определение базы в проекте потока сообщений, такого
не происходит. При создании проектов потоков сообщений, связывайте
с каждым из них новую папку в перспективе Broker Application Development.
Выделите элемент ASSESSOR в представлении DB Servers (Серверы БД) (выполнив
повторное соединение, если это необходимо). Выберите пункт Import to folder
(Импортировать в папку), выберите папку базы данных ASSESSOR. Нажмите Finish
(Готово) (рис 9.54).
(рис 9.54) Импортирование нового соединения с базой данных в Workbench
Щелкните правой кнопкой мыши по файлу ASSESSOR_ASSESSOR.dbmxmi в папке
базы ASSESSOR, выберите пункт меню New (Новый) $$\to$$ Other (Другое) $$\to$$ Schema
Definition (Определение схемы) $$\to$$ Next (Далее). Укажите схему EMERGE и нажмите Finish (Готово).
Теперь база данных ASSESSOR импортирована в Workbench. Ссылки на базу дан-
ных в инструкциях ESQL будут заполняться автоматически.
(рис 9.55) Проект базы данных ASSESSOR
9.6 Создание потоков сообщений
В этом разделе большая задача по созданию всех потоков сообщений разбита на четыре меньших этапа:
Создание проектов потоков сообщений и зависимостей.
Создание файлов потоков сообщений.
Соединение потоков сообщений (разделы 9.6.2 – 9.6.5) и настройка параметров узлов.
Написание esql-кода для всех вычислительных узлов.
9.6.1 Создание проектов потоков сообщений и зависимостей
Изучите дизайн организации потоков сообщений в разделе 9.3.2, "Потоки сообщений
и независимость от транспортных протоколов".
Хорошая организация потоков сообщений упрощает понимание решения и управление
им. Существует два набора транспортно-независимых потоков: потоки,
связанные с готовностью оценщика, 3, 3a, 4 и 4a и потоки, связанные с отчетом об
оценке 6, 6a, 7, 7a, 8 и 9. Мы используем два проекта потоков сообщений для
транспортно-независимых потоков, чтобы было понятно, где мы работаем с готовностью
(Availability), а где – с отчетами (Report).
Этим двум наборам транспортно-независимых потоков будут соответствовать два
набора транспортно-специфических потоков для протокола SOAP/http. Наконец, будет
проект потока сообщений для общих потоков SOAP/http.
В табл. 9.9 перечислены все проекты потоков сообщений – потоки, которые мы
будем создавать и их зависимости. Взаимоотношения между потоками, а также между
потоками и набором сообщений должны быть определены таким образом, чтобы
ссылки на потоки и наборы могли быть корректно разрешены. Мы также определим
пакеты для потоков сообщений, чтобы потенциально дублирующиеся имена потоков
можно было корректно различить. Эти пакеты называются схемами брокера.
Все потоки используют общую схему брокера, так что символьные ссылки разрешаются
в пределах этой схемы и путаницы с аналогично названными ресурсами из
других проектов не возникнет.
Зависимости между проектами потоков сообщений и проектами наборов сообщений
определяются в Workbench либо при создании нового проекта, либо позже,
с использованием графического интерфейса Workbench.
Создайте первый проект потока сообщений (рис 9.56). Выберите пункт меню File (Файл) $$\to$$ New (Новый) $$\to$$ Message Flow Project (Проект потока сообщений).
Введите имя AvailabilityFlows и нажмите (рис 9.56) Создание нового проекта потока сообщений
Создайте другие проекты потоков сообщений, перечисленные в табл. 9.9.
Добавьте зависимости, указанные в табл. 9.9, выбирая по очереди каждый проект,
набор сообщений и открывая его свойства (рис 9.57).
(рис 9.57) Зависимости в представлении Properties (Свойства)Проекты потоков сообщений и потоки сообщений
| Проект потока сообщений |
Поток сообщений |
Набор сообщений и база данных |
| Группа B
CommonSOAPHttpFlows
Зависимости: группа A |
Common.esqlЭто не поток, а общий модуль .esql. Мы будем использовать его позже. |
Группа A: Assessor Message Set
База данных ASSESSOR |
| Fault |
| Reply |
| ClientError |
| Группа C
AssessorReportFlows
Зависимости: группы A, B, D |
Flow6 |
| Flow6a |
| Flow7 |
| Flow7a |
| Flow8 |
| Flow9 |
| Группа D
AssessorReportSOAPHttpFlows
Зависимости: группы A, B, C |
Flow6aAck |
| Flow9Ack |
| Input6 |
| Output6a |
| Output7 |
| Output9 |
| Группа E
AvailabilityFlows
Зависимости: группы A, B, F |
Flow3 |
| Flow3a |
| Flow4 |
| Flow4a |
| Группа F
AvailabilitySOAPHttpFlows
Зависимости: группы A, B, E |
Flow3aAck |
| Input3 |
| Output3a |
Создайте схему брокера в каждом проекте потока сообщений:Выберите пункт меню File (Файл) $$\to$$ New (Новый) $$\to$$ Broker Schema (Схема брокера). Выберите один из проектов потоков сообщений и назовите схему proxyAssessorSystem. Нажмите Finish (Готово).
Скопируйте и вставьте схему в остальные проекты потоков сообщений.
(рис 9.58) Схема брокера
Создайте все файлы потоков сообщений, указанные в таблица 9.9)
(рис 9.59) Потоки сообщений
Настройте зависимости проекта набора сообщений и проектов потоков сообщений, как показано в таблице.
9.6.2 Создание потоков сообщений
В разделах 9.6.3 – 9.6.5 мы свяжем и сконфигурируем все потоки сообщений начиная
с общих потоков, а затем потоки, относящиеся к готовности и отчетам. Конфигурируются
все параметры потоков, а также топология потоков. Останется только запрограммировать
набор ESQL-файлов.
9.6.3 Создание потоков CommonSOAPHttpFlows
К общим потокам, которые нам нужно разработать, относятся подпотоки Fault
(Ошибка) и Reply (Ответ). Мы также должны создать каркасную процедуру Validate
SQL в файле common.esql, чтобы на нее могли ссылаться другие потоки.
Fault
Поток Fault возвращает правильно сформированное SOAP-сообщение, содержащее
информативное описание причины ошибки и правильно сформированный SOAP-код ошибки.
Данный подпоток используется для базовой обработки ошибок во всех потоках
сообщений. Он вызывается из входного узла любого потока сообщений при возникновении
исключения. Мы применяем одну и ту же процедуру обработки ошибок для
всех наших потоков сообщений. Эта процедура связана с терминалами Failure и Catch
входных (Input) узлов. Все прочие терминалы ошибок в потоках сообщений остаются
неподключенными, поэтому все исключения направляются через входной узел
в данную процедуру. За дополнительной информацией обращайтесь к интерактивной
справочной документации WebSphere Business Integration Message Broker,
"Handling errors in message flows".
Как и во всех подпотоках, начните поток с входного узла.
Создайте узел TryCatch. Мы не хотим, чтобы неперехваченные ошибки приводили к рекурсивному вызову потока Fault, поэтому мы добавляем узел TryCatch и направляем перехваченные им ошибки на трассировочный узел.
Создайте вычислительный узел Identify fault для создания сообщения об ошибке. Реализация узла Identify fault, как и всех остальных вычислительных узлов, вставляемых в потоки на данной стадии, описывается в разделе, посвященном разработке ESQL.
(рис 9.60) Поток ошибокПока же щелкните правой кнопкой мыши по узлу Identify fault, выберите пункт
меню Open ESQL, переименуйте ESQL-модуль в Fault_Identify_Fault и сохраните созданный
ESQL-файл. Убедитесь, что ESQL-модуль идентифицируется в параметре
ESQL Module, как показано на рис 9.61.
(рис 9.61) Указание пути к модулю ESQLСовет. Давайте ESQL-модулям информативные имена. Хорошей практикой является начинать
имя с имени потока и добавлять суффикс в виде имени вычислительного узла. Таким образом
код esql будет проще найти, и меньше будет вероятность выбрать неверный ESQL-модуль при
прямом открытии ESQL-файлов через навигатор.
Создайте узел HttpReply, который будет возвращать ошибку.
Создайте три трассировочных узла, которые помогут в будущем отладить поток.
Существует множество соглашений, которым нужно следовать и которые помогают
при отладке. Мы используем соглашение, связанное с применением зарезервированных
в каталоге сообщений WebSphere Business Integration Message Broker номеров
сообщений с 3051 по 3099, используем вывод в журнал событий Windows.
Каждый трассировочный узел имеет имя, соответствующее номеру ошибки, чтобы
можно было быстро выявить источник ошибки в потоке (рис 9.62).
(рис 9.62) Конфигурирование трассировочного узла
Соедините узлы и сохраните их. Используйте инструмент Connection (Соединение)
из палитры (рис 9.63).
(рис 9.63) Использование инструмента Connection для соединения узлов
Reply
Подпоток Reply (Ответ) – это простой узел HttpReply.
Создание подпотока Reply имеет две причины:
Для упаковки: при использовании другого транспорт-специфического проекта потока вместо проекта HttpSOAP связи подпотоков останутся теми же, будет использован только другой узел Reply.
Подпоток может быть более сложным при использовании других типов транспорта, и эта сложность будет заключена в потоке Reply.
(рис 9.64) Подпоток Reply
ClientError
Поток ClientError (Клиентская ошибка) просто отслеживает ошибки, возвращаемые
брокеру Web-службами или обнаруженные в клиентских потоках, и отправляет их
в журнал событий (рис 9.65).
(рис 9.65) Поток ClientErrorПозже, не затрагивая основного потока, можно будет добавить более сложную
обработку ошибок, с непрямой трассировкой ошибки до подпотока. Трассировочный
узел 3062 выводит дерево исключений и другую полезную информацию. На рис 9.66
показано, как вывести на экран все деревья брокера.
(рис 9.66) Задание шаблонных значений для трассировочного узла ClientError
9.6.4 Создание потоков AvailabilityFlows
На рис 9.67 показаны потоки AvailabilityFlows, которые нужно определить.
(рис 9.67) Потоки AvailabilityFlowsПоток Input3
Поток Input3 получает сообщение RequestAvailability от процесса ExternalClaimAssessors
и передает его потоку 3 (Flow3) для проверки и обработки. Исключения перехватываются
и передаются в процедуру Fault для возврата ошибки SOAP (рис 9.68).
(рис 9.68) Поток Input3Сконфигурируйте узел Http Input следующим образом:На закладке Basic (Общие) установите в поле URL Selector (Выбор URL) значение,
предоставленное архитектором решения в файле AssessorAvailablity(3).
wsdl: http://SAH41403:7080/RequestAssessorAvailability, и значение тайм-аута
60 секунд.Внимание! TCP/IP порт 7080 является портом слушателя по умолчанию для брокера сообщений.
Он задается командой mqsicreatebroker (-P номерпорта) и изменяется командой
mqsichangebroker.
На закладке Default (По умолчанию) укажите свойства набора сообщений так, как показано на рис 9.69.
(рис 9.69) Свойства набора сообщений для узла Http Input
На закладке Validation (Проверка) укажите в поле Validate (Проверять) значение Content and Value (Содержимое и значение).
Поток Flow3
Данный поток сообщений получает сообщение от потока Input3, проверяет его, посылает
назад ответ-подтверждение и вызывает поток 4 (flow4) для распределения сообщения
по оценщикам (рис 9.70).
(рис 9.70) Основа потока 3Создайте следующие узлы:Вычислительный узел Validate для проверки входящего сообщения.
Мы напишем код ESQL позже, в разделе 9.7.4, "ESQL-код обработки ошибок".Сейчас откройте код ESQL через пункт меню, появляющегося при нажатии правой кнопки мыши, и сохраните код, заданный по умолчанию (рис 9.71).
(рис 9.71) Для создания ESQL-модуля по умолчанию выберите пункт меню Open ESQL (Открыть ESQL)Это позволит устранить ошибку компиляции.
На закладку Basic (Общие) страницы Properties (Свойства) вычислительного
узла (рис 9.72) установите в поле Data Source (Источник данных) схему
EMERGE, а в поле Compute Mode (Режим вычислений) оставьте значение Message
(Сообщение). Это опция, установленная по умолчанию, которая позволяет
любым изменениям, вносимым в папки сообщений в данном режиме, распространяться
на последующие узлы. Мы устанавливаем в поле Compute
Mode (Режим вычислений) значения Message и LocalEnvironment для узлов,
которые должны изменять и распространять агрегационную информацию,
хранящуюся в дереве LocalEnvironment, а также в дереве сообщений.
(рис 9.72) Установка общих свойств вычислительного узла
На закладке Validation (Проверка) установите в поле Validate (Проверять)
значение Content and Value (Содержимое и значение), как показано на
рис 9.73. Эту опцию можно отключить по окончании тестирования для
увеличения производительности работающей системы.
(рис 9.73) Установка параметров проверкиПримечание. В дальнейшем мы предполагаем, что эти параметры вычислительных узлов
и проверки установлены на всех узлах, которые занимаются передачей информации в папках.
Создайте связующий узел Create Reply, который будет связывать ответ с сообщением-подтверждением.
Создайте подпоток Flow4. Создайте пока пустой подпоток, добавив в Flow4 узел Input и сохранив его. Теперь можно добавить подпоток Flow4 в Flow3 еще до того, как будут определены детали Flow4. Перетащите Flow4 в Flow3.
Подпоток Reply. Перетащите поток Reply в поток Flow3.
Теперь сконфигурируем узел соответствия.
Конфигурирование связующего узла Create Reply
Выполните следующие шаги:
Щелкните правой кнопкой мыши по связующему узлу Create Reply и выберите пункт меню Open Mappings (Открыть связи).
Щелкните правой кнопкой мыши по окну Source (Источник) и выберите пункт меню ).
(рис 9.74) Выбор конверта SOAP для связи сообщений
Раскройте схемы сообщений и свяжите claimID в сообщении-источнике и в сообщении-цели.
Щелкните правой кнопкой мыши по элементу TimeStamp и выберите пункт меню Create one-sided mapping (Создать одностороннюю связь).
Нажмите на кнопку с тремя точками справа от слова ).
Сохраните файл связей.

(рис 9.76) Установление связей Flow3_Create_Reply(рис 9.75) Указание значения CURRENT_TIMESTAMP
Поток Flow4
Этот поток сообщений (рис. 9.77) получает проверенное сообщение от потока flow3
и генерирует одно или несколько сообщений, которые распространяются между
оценщиками.
(рис 9.77) Поток Flow4Он также обновляет таблицу CLAIMASSESSOR базы данных, сохраняя информацию,
которая должна быть вставлена в сообщения-ответы, возвращаемые в процесс
ExternalClaimAssessors.
Входящее сообщение содержит URL оценщика. Для ответа, возвращаемого процессу
ExternalClaimAssessors в потоке Flow3a, также нужен URL оценщика, поэтому
мы сохраняем его и будем извлекать позже, используя claimID и assessorID.
Нам нужно сохранить идентификаторы всех сообщений (msgid) для всех сообщений
потока Flow4, чтобы можно было устанавливать корреляцию с ответами
оценщиков. Мы не можем делать допущение о том, что ответы будут содержать
корреляционный ID (correlationId) WebSphere MQ, поскольку нам нужно реализовывать
решение с использованием транспортного протокола SOAP/http и других
протоколов.
Поток Flow4 генерирует уникальный идентификатор msgid для сообщения, посылаемого
оценщику, путем создания реального сообщения WebSphere MQ и отправки
его в узел агрегации с сохранением msgid в базе CLAIMSASSSESSOR для воссоздания
корреляционного идентификатора при последующей агрегации.
Ниже приводятся данные о конфигурации потока.
Мы начинаем с узла TryCatch для предотвращения возврата ошибок клиенту брокера.
Клиент брокера не ожидает никаких сообщений об ошибке, поскольку он
уже получил подтверждение. Любые ошибки, возникающие здесь, обрабатываются
брокером путем передачи управления в общую процедуру ClientError.
Используйте узел DataDelete для удаления старого экземпляра претензии из базы
данных. Обратите внимание, что, если удаление производится средствами SQL,
а указанный claimID не обнаруживается, возвращается предупреждение (соответствующее
положительному номеру ошибки SQL). Данный узел по умолчанию
сконфигурирован на игнорирование предупреждений [Опция Treat Warnings As
Errors (Обрабатывать предупреждения как ошибки) в свойствах узла должна быть отключена.] За инструкциями по конфигурированию узла DataDelete обращайтесь
к разделу "Конфигурирование узла Data Delete с именем Delete claim status".
Узел Prepare MQ удаляет HTTP-данные из папок сообщения и подготавливает папку
MQ перед передачей папок в узел Aggregate Control.
Это этап, связанный с защитным программированием. Мы не знаем, может ли
функция агрегации воспринимать разные типы папок на разных узлах. Поскольку
мы будем использовать WebSphere MQ в качестве интерфейса к узлам
агрегирования, мы делаем так, чтобы для всех узлов агрегирования поток
сообщений выглядел сходно с WebSphere MQ.
В узле Aggregate Control присвойте агрегату имя proxyAssessorSystem и укажите
тайм-аут для узла Aggregate Reply. Для тестирования мы устанавливаем здесь значение,
равное 115 секундам (рис 9.78).
(рис 9.78) Свойства узла Aggregate Control
Вычислительный узел Fan out передает новое сообщение-запрос каждому оценщику,
указанному во входящем массиве оценщиков. Также этот узел сохраняет
HTTP URL для маршрутизации сообщения в локальном окружении (Local
Environment). На этой стадии просто сгенерируйте ESQL-модуль по умолчанию
для этого вычислительного узла, которому присвойте имя Flow4_Fan_Out:. (К реализации
этого узла мы вернемся позже.)URL-адрес нужно где-то сохранить для последующего использования при создании
HTTP-сообщения-запроса к оценщику, поскольку в папке сообщения URL не
содержится. Мы также собираемся сохранить URL в базе данных CLAIMASSESSOR,
возвращаемой в процесс ExternalClaimAssessor, как это определяется в его
интерфейсе. Данный URL можно было бы сохранить в базе данных на этом этапе
и прочитать позже, при задании URL пункта назначения. Нам пришлось бы сделать
это таким способом, если бы мы решили считывать сообщение-запрос из очереди
Assessor, а не соединять оставшуюся часть потока с выходным терминалом узла
MQOut Assessor. Передача URL в локальное окружение (local environment) –
несколько более эффективный способ, поэтому мы выбрали этот подход.
Вычислительный узел PrepareMQControl передает сообщение для отправки на управляющий
терминал узла AggregateReply в потоке Flow3a. Снова сгенерируйте ESQL-модуль
по умолчанию с именем Flow4_Control_Message.
Узел MQOutput, с именем MQOut Flow3a, посылает управляющее сообщение потоку
Flow3a. Укажите в поле Queue Name (Имя очереди) на закладке Basic (Общие)
значение FLOW3A.CONTROL. Поле Queue Manager (Менеджер очереди) оставьте
пустым, чтобы использовался заданный по умолчанию менеджер очереди.
На всех остальных закладках оставьте значения по умолчанию.На закладке Advanced (Дополнительно) нужно указать в поле Message context
(Контекст сообщения) значение Set All (Установить все).
Узел MQOutput с именем MQOut Assessor посылает сообщение-запрос в очередь Assessor.
Это сообщение никогда не считывается и все время существует. Чтобы добиться
этого в рабочей системе, можно размещать сообщения с истекшим сроком действия
или, вместо того чтобы связывать выходной терминал узла с узлом AggregateRequest,
создать еще один узел MQInput для считывания сообщения. Вы можете указать сгене-
рированный msgid, чтобы удостовериться в том, что считывается нужное сообщение.
На закладке Advanced (Дополнительно) нужно указать в поле Message context
(Контекст сообщения) значение Set All (Установить все) и установить опцию New
Message ID (Новый ID сообщения).
(рис 9.79) Параметры на закладке Advanced (Дополнительно)
В узле AggregateRequest укажите в поле Folder Name (Имя папки) значение Flow4.
Это имя применяется в объединенном сообщении узла AggregateReply в качестве
имени папки для хранения ответа на запрос.
Чтобы сохранить запрос в таблице CLAIMSASSESSOR, нам нужно использовать вычислительный
узел Save AssessorRequest, а не узел Database Update, поскольку одно
из полей связано с папкой LocalEnvironment, а не с входным сообщением.
Укажите в поле Data Source (Источник данных) схему EMERGE и сгенерируйте
ESQL-модуль по умолчанию с именем Flow4_Save_AssessorRequest. Сам код ESQL мы
добавим позже.
Узел HttpRequest с именем SOAP/Http Assessors посылает запрос о готовности
каждому оценщику. Для узла принимаются параметры по умолчанию, за исключением
следующих:На закладке Basic (Общие):Укажите в поле Web service URL (URL Web-службы) значение http://SAH414A:7080/UNKNOWN.
Вообще URL оценщика задается в вычислительном узле.
Если используется данный URL, это означает ошибку. Мы можем
либо реализовать этот URL в брокере, либо просто оставить данное довольно
информативное значение, которое можно идентифицировать в журнале
событий как сообщение об ошибке SOAP.
Для тестирования укажите в поле Request Timeout (Тайм-аут запроса) значение 60 секунд.
Выберите вариант Follow Http redirection (Выполнять HTTP-перенаправление)
в поле Http Redirection Requests (Запросы перенаправления HTTP).
На закладке Advanced (Дополнительно) включите опцию Replace input message with web-service response (Замещать входное сообщение ответом Web-службы).
На закладке Default (По умолчанию) укажите свойства сообщения, как показано на рис 9.69.
На закладке Validation (Проверка) укажите в поле Validate (Проверять) значение Content and Value (Содержимое и значение).
Ответы-подтверждения от оценщиков можно связать для тестирования с трассировочным
узлом. В рабочей системе этот ответ можно отслеживать для измерения
доступности систем оценщиков.
Конфигурирование узла Data Delete с именем Delete claim status
Щелкните по узлу Delete claim status правой кнопкой мыши и в его свойствах укажите в поле Data Source (Источник данных) схему EMERGE.
Откройте редактор связей из панели свойств и выполните следующее:Выберите, как и в предыдущем разделе, SOAP envelope в поле Source (Источник).
Щелкните правой кнопкой мыши по полю Target (Цель) и выберите пункт Add
RDB Table Mapping Output (Добавить точку выхода для связи с таблицей реляционной БД).
Мы предполагаем, что вы выполнили инструкции, приведенные в разделе 9.5.3,
"Соединение базы данных с рабочим местом брокера". Согласитесь с пунктом
Add database table schemas from workspace (Добавить схемы таблиц базы
данных из рабочего пространства), нажмите Next (Далее), выберите таблицу
ASSESSOR_ASSESSOR_EMERGE_CLAIMASSESSOR и нажмите Finish (Готово).
Щелкните правой кнопкой мыши по полю Target (Цель), выберите пункт меню
Set RDB Schema name (Указать имя схемы РБД), установите переключатель
Use schema name in table definition (Использовать имя схемы в определении таблицы).
Соедините ClaimID в поле Source (Источник) с полем Target (Цель), чтобы указать,
что для удаления строки таблицы значение claimID должно совпадать.
Сохраните файл связей (рис 9.80).
(рис 9.80) Задание условия удаления для таблицы CLAIMASSESSOR
Поток Flow4a
Этот поток сообщений получает сообщение Flow4a от оценщика, проверяет его, посылает
подтверждение и вызывает поток Flow3a для выполнения агрегации (рис 9.81).
(рис 9.81) Поток Flow4aСоздайте следующие узлы:узел HttpInput для ожидания сообщения о готовности;
вычислительный узел Validate для проверки входного сообщения;
связующий узел Create Reply для связывания ответа с сообщением-ответом.
Перетащите потоки Reply, Fault и Flow3a в данный поток.
Сконфигурируйте узел HttpInput:На закладке Basic (Общие):Значение для поля URL selector (Селектор URL) предоставляется архитектором решения. Установите http://SAH414A:7080/AvailabilityReceive.
Для тестирования укажите в поле Maximum Client Wait time (Максимальное время ожидания клиента) значение 60 секунд.
На закладке Default (По умолчанию) укажите параметры набора сообщений так, как показано на рис 9.69.
На закладке Validation (Проверка) укажите в поле Validate (Проверять) значение Content and Value (Содержимое и значение).
Переименуйте сгенерированный ESQL-модуль для вычислительного узла Validate в Flow4a_Validate.
Сконфигурируйте трансформацию связей для возврата подтверждения оценщику так, как описано в разделе "Поток Flow3".
Совет. Вспомните, что мы связываем элемент AvailabilityResponse с возвращаемыми
элементами AvailabilityReponse, на которые ссылается сообщение soap11:envelope, так что
связи нужно устанавливать с сообщением soap11:envelope.
Поток Flow3a
Данный поток сообщений (рис 9.82) получает все корректные сообщения из потока
Flow4a и генерирует сообщение Flow3a, передаваемое в процесс ExternalClaimAssessors.
Это часть агрегации, относящаяся к объединению сообщений.
Здесь мы также используем базу данных 'CLAIMASSESSOR' в силу нескольких
причин:
Входящее сообщение не содержит URL оценщика, но для сообщения Flow3a URL оценщика необходим, поэтому мы извлекаем его, используя ключ ClaimID/AssessorID.
Сообщение Flow4a от оценщика не обязательно поступает из WebSphere MQ, поэтому нельзя предполагать, что оно содержит корреляционный ID (corellID), связанный с msgid исходного сообщения. При агрегации предполагается, что в corellID не содержится данное значение, поэтому поток извлекает исходный msgid из таблицы и передает его в узел AggregateReply как CorellID.
Для целей аудита сообщения записываются в базу данных CLAIMASSESSOR.
(рис 9.82) Поток Flow3aУзел MQInput Control получает контрольное сообщение агрегации из потока Flow3:На закладке Basic (Общие) укажите в поле Queue Name (Имя очереди) значение FLOW3A.CONTROL.
На закладке Default (По умолчанию) укажите в поле Message Domain (Домен сообщений) значение XML. Никакие другие свойства на этой закладке не требуются.
На закладке Advanced (Дополнительно) укажите в поле Transaction mode (Режим транзакций) значение No. Координация с другими сообщениями MQ не требуется.
На закладке Validation (Проверка) укажите в поле Validate (Проверять) значение Content and Value (Содержимое и значение).
Создайте узел TryCatch для предотвращения возврата ошибок в предыдущий сервисный поток.
Соедините подпоток ClientError с терминалами Catch и Failure узлов MQInput и с терминалом Catch узла TryCatch.
Создайте узел типа Database update с именем Update CLAIMASSESSOR. Этот узел заносит в базу данных CLAIMASSESSOR ответ каждого оценщика.
Создайте вычислительный узел Prepare Reply и сгенерируйте ESQL-модуль по умолчанию с именем Flow3a_Prepare_Reply. Он будет использоваться для подготовки сообщения WebSphere MQ к передаче в узел AggregateReply.
Создайте узел MQ Reply с именем MQReply AggIn, где AggIn – имя очереди.
Создайте узел MQ Input с именем MQInput AggIn, где AggIn – имя очереди. Настройте параметры по умолчанию для обращения к набору сообщений, как описано выше.
В узле AggregateReply укажите в поле Aggregate Name (Имя агрегата) то же имя, что и для узла AggregateControl, – proxyAssessorSystem. Укажите тот же период тайм-аута – 115 секунд. Это период, по истечении которого неопознанные ответы отбрасываются, если они приходят до контрольного сообщения. Отключите опцию Transaction Mode (Режим транзакции), поскольку мы не ограничиваемся сообщениями WebSphere MQ.
Создайте вычислительный узел Generate Output3a и сгенерируйте ESQL-модуль по умолчанию с именем Flow3a_Generate_Output3a для создания отправляемого сообщения Flow3a.
Создайте пустой поток Output3a и установите с ним связь.
Свяжите терминалы Unknown и Timeout узла AggregateReply с трассировочными узлами, сконфигурированными так же, как трассировочные узлы в потоке Fault, но используйте специфические номера ошибок, которые помогут в отладке. В реальном работающем потоке можно применять несколько более контролируемый способ перехвата данных условий.
Свяжите терминал Out узла Timeout с потоком Output3a, поскольку мы хотим пересылать незаполненные до конца наборы ответов.
Поток Output3a
Поток Output3a (рис 9.83) связывает систему proxyAssessorSystem с корпоративной
сервисной шиной компании LGI по протоколу SOAP/http и возвращает список готовых
оценщиков в процесс ExternalClaimAsessors.
(рис 9.83) Поток Output3aСконфигурируйте свойства узла HttpRequest следующим образом:на закладке Basic (Общие):укажите в поле Web service URL (URL Web-службы) ссылку на элемент Rece
iveAssessorAvailabilityList в процессе ExternalClaimAssessor:
http://SAH414B:9082/AssessorAvailabilityList;
для тестирования укажите в поле Request Timeout (Тайм-аут запросов)
значение 60 секунд;
выберите вариант Follow Http redirection (Выполнять HTTP-перенаправление)
в поле Http Redirection Requests (Запросы перенаправления HTTP);
оставьте без изменения параметры на закладках Advanced (Дополнительно)
и Error (Ошибка);
параметры на закладке Default (По умолчанию) установите так, как показано
на рис 9.69;
укажите на закладке Validation (Проверка) в поле Validate (Проверять) значение Content and Value (Содержимое и значение).
Для тестирования направьте ответ в журнал событий, как показано в потоке Flow4.
Поток Output3aAck
Поток Output3aAck для SOAP/Http-реализации корпоративной сервисной шины LGI
не нужен, поскольку подтверждение приходит на узел HttpRequest в потоке Output3a.
9.6.5 Создание потоков AssessorReport
На рис 9.84 показаны потоки, которые должны быть созданы для взаимодействий,
связанных с отчетами оценщиков (Assessor Report).
(рис 9.84) Потоки AssessorReportInput6
Поток Input6 (рис 9.85) получает запрос на отчет об оценке от процесса
ExternalClaimAssessor, передает управление в поток Flow6 для проверки и обработки
и обрабатывает любые ошибки, возвращая SOAP-ошибку. Используется та же схема,
что для потока Input3.
(рис 9.85) Поток Input6Сконфигурируйте узел Http Input следующим образом:
На закладке Basic (Общие) установите в поле URL Selector (Выбор URL) значение, предоставленное архитектором решения в файле AllocateAssessmentRequest(6). wsdl: http://SAH414A:9080/AllocateAssessmentRequest и значение тайм-аута 60 секунд.
На закладке Default (По умолчанию) укажите свойства набора сообщений так, как показано на рис 9.69.
На закладке Validation (Проверка) укажите в поле Validate (Проверять) значение Content and Value (Содержимое и значение).
Поток Flow6
Поток Flow6 (рис 9.86) проверяет запрос, полученный из потока Input6, перед
отправкой оценщику запроса на отчет об оценке. В потоке Flow6 используется та же
схема, что и в потоке Flow3.
(рис 9.86) Поток Flow6
Поток Flow7
Поток Flow7 (рис 9.87) посылает запрос отчета об оценке конкретному оценщику.
В таблице ACTIONASSESSOR для целей аудита хранится запись о запросах, в которую
в потоке flow8 заносятся ответы. URL оценщика устанавливается в вычислительном
узле set SOAP address. Код ESQL будет описываться ниже.
(рис 9.87) Поток Flow7Создайте следующие узлы:узел TryCatch для предотвращения возврата ошибок в предыдущий поток,
в данном случае поток flow6, а также создайте связанный с ним поток
ClientError для обработки ошибок;
узел Database Delete (Удаление из базы данных) для очистки устаревших записей в таблице ACTIONASSESSOR, указанных комбинацией ключей claimID/assessorID;
связующий узел (Mapping) с именем Map flow6 to flow7;
узел Database Insert (Вставка в базу данных) с именем Insert Audit trail into ACTIONASSESSOR;
вычислительный узел с именем set SOAP address;
узел HTTP Request с именем SOAP/Http Request;
трассировочный узел с именем Trace Reply 3058 для перехвата ответов.
На этот раз узел Database Delete очищает предыдущий экземпляр претензии, по-
сланной конкретному оценщику.Этот экземпляр узла Database Delete отличается от узла, описанного в разделе
"Конфигурирование узла DataDelete с именем Delete claim status", тем, что
существует два ключевых поля и их нужно объединить, чтобы выбрать правильный
набор строк.
Для этого нужно выполнить следующие действия:
Установите связь между сообщением ActionAssessor(6) и таблицей ACTIONASSESSOR, как показано на рис 9.88.
(рис 9.88) Связи для удаления претензии, направленной конкретному оценщику, в потоке Flow6
Щелкните по полям ASSESSORID и CLAIMID в представлении Outline (Общий обзор), удерживая клавишу Shift, чтобы выбрать оба столбца, и нажмите правую кнопку мыши (рис 9.89).
(рис 9.89) Выбор обоих полей для формирования связующего выражения
Выберите пункт меню ). Нажмите (рис 9.90) Изучение связующего выражения
Вы можете просмотреть выражение для удаления данных, выделив объединенную связь или одно из ее полей и щелкнув правой кнопкой мыши, выбрать пункт Edit Mapping (Редактировать связь). Нажмите OK (рис 9.91).
(рис 9.91) Редактирование выражения для удаления данных
Сгенерируйте ESQL-модуль по умолчанию для вычислительного узла Set SOAP address, назвав его Flow7_Set_SOAP_address.
Сконфигурируйте свойства узла HttpRequest следующим образом:закладка Basic (Общие):укажите в поле Web service URL (URL Web-службы) значение http://SAH414A:7080/UNKNOWN, как это делалось для потока Flow4;
для тестирования укажите в поле Request Timeout (Таймаут запроса) значение 60 секунд;
выберите вариант Follow Http redirection (Выполнять HTTP-перенаправление) в поле Http Redirection Requests (Запросы перенаправления HTTP).
оставьте без изменения параметры на закладках Advanced (Дополнительно) и Error (Ошибка);
параметры на закладке Default (По умолчанию) установите так, как показано на рис 9.69;
укажите на закладке Validation (Проверка) в поле Validate (Проверять) значение Content and Value (Содержимое и значение).
Связи, идущие от потока flow6 к потоку flow7, показаны на рис 9.92.
(рис 9.92) Связи от потока flow6 к потоку flow7
Вставка в базу данных показана на рис 9.93.
(рис 9.93) Вставка запроса отчета об оценке в таблицу ACTIONASSESSORВажно! Не забудьте объединить все связи в одной строке, иначе каждая связь будет вводиться
в таблицу как одна строка.Выделите все связи с помощью мыши, удерживая клавишу Shift, и выберите в меню правой
кнопки мыши пункт Combine to same row (Объединить в одну строку) > Remove selected
mappings (Удалить выбранные связи).
Для тестирования запишите ответ в журнал событий, как в потоке Flow4.
Поток Flow7a
Данный поток сообщений (рис 9.94) получает сообщение Flow7a от оценщика, который
был выбран для создания отчета об оценке, проверяет сообщение, отправляет
подтверждение и вызывает поток Flow6a, чтобы вернуть данные о согласии или отказе
оценщика в процесс ExternalClaimAssessors. Этот поток похож на поток Flow4a.
(рис 9.94) Поток Flow7aСоздайте следующие узлы:узел HttpInput для ожидания сообщения о готовности;
вычислительный узел Validate для проверки входного сообщения;
связующий узел Generate Reply для связывания ответа с сообщением-ответом.
Перетащите потоки Reply, Fault и Flow6a в данный поток.
Сконфигурируйте узел HttpInput:На закладке Basic (Общие) проделайте следующее:Значение для поля URL selector (Селектор URL) предоставляется архитектором решения. Установите http://SAH414A:7080/DeliverAssessmentRespons.
Для тестирования укажите в поле Maximum Client Wait time (Максимальное время ожидания клиента) значение 60 секунд.
На закладке Default (По умолчанию) укажите параметры набора сообщений так, как показано на рис 9.69.
На закладке Validation (Проверка) укажите в поле Validate (Проверять) значение Content and Value (Содержимое и значение).
Переименуйте сгенерированный ESQL-модуль для вычислительного узла Validate в Flow7a_Validate.
Сконфигурируйте связи для подтверждения так, как показано на рис 9.95.
(рис 9.95) Связи для сообщения-подтверждения для потока Flow7a
Поток Flow6a
Поток Flow6a (рис 9.96) форматирует ответ с согласием оценщика для вывода
потоком Output6a и сохраняет аудиторскую запись об ответе в таблице ACTIONASSESSORS.
(рис 9.96) Поток Flow6aСоздайте в потоке Flow6a следующие узлы:узел TryCatch и подпоток ClientError для изоляции возникающих здесь ошибок;
узел Database Update для хранения аудиторской записи;
связующий узел (Mapping), форматирующий сообщения для потока Output6a;
подпоток Output6a, возвращающий результаты в процесс ExternalClaimAssessor.
Создайте связи для обновления данных в таблице (рис 9.97).Выберите сообщение-источник и цель – таблицу базы данных ACTIONASSESSOR, как описывалось ранее. Не забудьте указать схему EMERGE базы данных. См. пример на рис 9.80.
Свяжите два поля и задайте одностороннюю связь типа CURRENT_TIMESTAMP, как показано на рис 9.97.
Объедините обновления в одну строку, используя щелчок мыши при нажатой клавише Shift, после чего выберите пункт меню Remove selected rows (Удалить выбранные строки). Будет выведена панель Combine Data Update Mappings (Комбинированные данные для связей обновления). Вам нужно вручную ввести условия обновления (конечно, это предложение SQL WHERE).
(рис 9.97) Конфигурация обновления базы данных в потоке Flow6aСовет. Одним из способов создания этого предложения и его вставки является создание узла
Data Delete и копирование условий удаления.
Создайте связи для вызова потока Output6a, как показано на рис 9.98.
(рис 9.98) Связи для потока flow6a
Поток Output6a
Поток Output6a (рис 9.99) связывает систему proxyAssessorSystem с корпоративной
сервисной шиной LGI при помощи протокола SOAP/http и передает список с данными
о готовности оценщиков в процесс ExternalClaimAssessor.
(рис 9.99) Поток Output6aСконфигурируйте свойства узла HttpRequest следующим образом:на закладке Basic (Общие) проделайте следующее:укажите в поле Web service URL (URL Web-службы) значение ссылки на ReceiveAssessorAvailabilityList в процессе ExternalClaimAssessor – http://SAH414B:9082/AssessorAvailabilityList ;
для тестирования укажите в поле Request Timeout (Тайм-аут запроса) значение 60 секунд;
выберите вариант Follow Http redirection (Выполнять HTTP-перенаправление) в поле Http Redirection Requests (Запросы перенаправления HTTP);
параметры на закладках Advanced (Дополнительно) и Error (Ошибка) оставьте без изменения;
на закладке Default (По умолчанию) укажите свойства сообщения, как показано на рис 9.69;
на закладке Validation (Проверка) укажите в поле Validate (Проверять) значение Content and Value (Содержимое и значение).
Для тестирования направляйте ответ в журнал событий, как в потоке Flow4.
Поток Output6aAck
Поток Output6aAck не нужен, поскольку мы используем SOAP/http и ответ
возвращается в узел Http Request потока Output6a.
Поток Flow8
Поток Flow8 (рис 9.100) получает отчет от выбранного оценщика и направляет его
в поток Flow9 (рис 9.102). Он напоминает поток Flow7a.
(рис 9.100) Поток Flow8Создайте следующие узлы:узел HttpInput для ожидания сообщения о готовности;
вычислительный узел Validate для проверки входного сообщения;
связующий узел Generate Reply для связывания ответа с сообщением-ответом.
Перетащите потоки Reply, Fault и Flow9 в данный поток.
Сконфигурируйте узел HttpInput:На закладке Basic (Общие) проделайте следующее:Значение для поля URL selector (Селектор URL) предоставляется архитектором решения. Установите http://SAH414A:7080/AssessorReport.
Для тестирования укажите в поле Maximum Client Wait time (Максимальное время ожидания клиента) значение 60 секунд.
На закладке Default (По умолчанию) укажите параметры набора сообщений так, как показано на рис 9.69.
На закладке Validation (Проверка) укажите в поле Validate (Проверять) значение Content and Value (Содержимое и значение).
Сконфигурируйте связующий узел Generate Reply так, как показано на рис 9.101.
(рис 9.101) Конфигурирование связей для подтверждения в потоке Flow8
Поток Flow9
Поток Flow9 (рис 9.102) готовит сообщение с отчетом оценщика к передаче на принимающую
партнерскую ссылку в процесс ExternalClaimAssessor. Он передает сообщение
в поток Output9 для помещения на сервисную шину LGI после обновления
своего аудиторского журнала.
(рис 9.102) Поток Flow9Создайте в потоке следующие узлы:узел TryCatch и подпоток ClientError для изоляции возникающих здесь ошибок;
узел Database Update с именем Update ActionAssessor table для хранения аудиторской записи;
связующий узел (Mapping), форматирующий сообщения для потока Output9;
подпоток Output9, возвращающий результаты в процесс ExternalClaimAssessor.
Создайте связи для обновления данных в таблице, как показано на рис 9.103, используя процедуру, аналогичную описанной для потока Flow6a.
(рис 9.103) Выражение обновления базы данных для потока Flow9
Создайте связи с сообщением, показанные на рис 9.104.
(рис 9.104) Связи с сообщением для потока Flow9
Поток Output9
Поток Output9 (рис 9.105) связывает систему proxyAssessorSystem с корпоративной
сервисной шиной LGI при помощи протокола SOAP/http и передает отчет оценщика
в процесс ExternalClaimAssessor.
(рис 9.105) Поток Output9Сконфигурируйте свойства узла HttpRequest следующим образом:на закладке Basic (Общие) проделайте следующее:укажите в поле Web service URL (URL Web-службы) значение ссылки на ReceiveAssessorAvailabilityList в процессе ExternalClaimAssessor – http://SAH414B:9082/assessorReport ;
для тестирования укажите в поле Request Timeout (Тайм-аут запроса) значение 60 секунд;
выберите вариант Follow Http redirection (Выполнять HTTP-перенаправление) в поле Http Redirection Requests (Запросы перенаправления HTTP);
параметры на закладках Advanced (Дополнительно) и Error (Ошибка) оставьте без изменения;
на закладке Default (По умолчанию) укажите свойства сообщения, как показано на рис 9.69;
на закладке Validation (Проверка) укажите в поле Validate (Проверять) значение Content and Value (Содержимое и значение).
Для тестирования направляйте ответ в журнал событий, как в потоке Flow4.
Поток Output9aAck
Поток Output9aAck не нужен, поскольку мы используем SOAP/http и ответ
возвращается в узел Http Request потока Output9.
9.7 Создание кода ESQL для потоков сообщений
Последний этап конфигурирования потоков сообщений в брокере – это написание
ESQL-кода для вычислительных узлов. Чтобы просмотреть все созданные нами для
потоков ESQL-модули, откройте свойства любого вычислительного узла и нажмите
кнопку Browse (Обзор) (рис 9.106).
(рис 9.106) Обзор ESQL-модулейНа рис. рис 9.107 показан список ESQL-модулей, необходимых для proxyAssessorSystem,
плюс модуль объявлений, common.esql.
(рис 9.107) ESQL-модули, которые необходимо написатьНам нужно написать 14 ESQL-модулей. Может показаться, что это очень много
кода, но этот код делится лишь на такие четыре категории, как:
Реализация агрегации SOAP/http, для которой 5-я версия брокера не имеет готовой поддержки (6 модулей).
Обработка ошибок. С помощью этого кода мы пытаемся ввести несколько больше диагностической информации в стандартные средства вывода данных об ошибках (6 модулей).
Конструирование SOAP-адреса для отправки запроса на отчет выбранному оценщику.
Повышение удобства чтения кода путем определения префиксов пространств имен в модуле common.esql.
На рис 9.108 приводятся 15 связующих узлов, которые выполняют большую
часть посреднических функций и манипуляций с данными и не требуют написания
ESQL-кода.
(рис 9.108) Связующие модули9.7.1 ESQL-функции, поддерживающие агрегацию
В табл. 9.10 перечислены семь ESQL-модулей, необходимых для конкретных потоков
сообщений.
ESQL-модули для конкретных потоков сообщений
| ESQL-модуль |
Описание |
| Flow4_PrepareMQ |
Преобразует входящее HTTP-сообщение в WebSphere MQ |
| Flow4_Fan_Out |
Конструирование сообщений-запросов к индивидуальным
оценщикам, создание и сохранение идентификатора ответа
и указание для каждого оценщика адреса SOAP/http |
| Flow4_PrepareMQControl |
Создание управляющего сообщения WebSphere MQ для отправки
в узел Aggregate Reply |
| Flow4_Save_Assessor_Request |
Сохранение сообщения-запроса, направляемого оценщику, в базе
данных CLAIMSASSESSOR |
| Flow3a_Prepare_Reply |
Корреляция данных о готовности оценщика с идентификатором
ответа и вставка в папку LocalEnvironment |
| Flow3a_Generate_Output3a |
Создание агрегированного ответа о готовности оценщиков для
отправки в процесс ExternalClaimAssessors |
| Flow7_Set_SOAP_Address |
Задание SOAP/http-адреса оценщика для отправки запроса на отчет
об оценке |
Flow4_PrepareMQ
В примере 9.9 входное сообщение копируется в выходную папку с удалением
HTTP-заголовков и заменой их новым MQMD.
CREATE COMPUTE MODULE Flow4_PrepareMQ
CREATE FUNCTION Main() RETURNS BOOLEAN
BEGIN
SET OutputRoot = InputRoot;
SET OutputRoot.HTTPInputHeader = null;
SET OutputRoot.HTTPResponseHeader = null;
CREATE NEXTSIBLING OF OutputRoot.Properties domain 'MQMD';
SET OutputRoot.MQMD.StrucId = MQMD_STRUC_ID; -- create MQMD
SET OutputRoot.MQMD.Version = MQMD_CURRENT_VERSION;
SET OutputRoot.MQMD.Format = ' ';
SET OutputRoot.MQMD.MsgType = MQMT_DATAGRAM;
RETURN TRUE;
END;
Flow4_Fan_Out
В примере 9.10 представлен ESQL-код
для модуля Flow4_Fan_out. Код имеет восемь частей.
Почти весь код (за исключением данных в SQL-инструкциях Insert и ссылках
LocalEnvironment) сгенерирован с помощью функции автозаполнения (Autocomplete),
так что этот код написать гораздо проще, чем кажется на первый взгляд.
Объявление локальных переменных.
Цикл while, в котором перебираются оценщики в списке оценщиков.
Копирование InputLocalEnvironment в OutputLocalEnvironment.
Задание пункта назначения SOAP/http в папке LocalEnvironment для динамического использования в узле HTTPRequest.
Копирование данных сообщения-запроса к оценщику из входного сообщения в выходное сообщение.
Передача сообщения для каждого оценщика и его папки LocalEnvironment далее по потоку сообщений.
CREATE COMPUTE MODULE Flow4_Fan_Out
CREATE FUNCTION Main() RETURNS BOOLEAN
BEGIN
DECLARE numberOfAssessors INTEGER CARDINALITY (InputRoot.MRM.soap11:Body.
fl3:requestAssessorAvailability.fl3:assessorList.fl3:assessors[]);
DECLARE assessorCount INTEGER 0;
WHILE assessorCount < numberOfAssessors DO
-- Эти инструкции должны быть в цикле, т.к. при передаче OutputRoot
очищается
CALL CopyMessageHeaders();
SET OutputLocalEnvironment = InputLocalEnvironment;
SET OutputRoot.MQMD.MsgType = MQMT_REQUEST;
SET OutputRoot.MQMD.ReplyToQ = 'AggIn';
SET OutputRoot.MQMD.Report = MQRO_COPY_MSG_ID_TO_CORREL_ID;
SET assessorCount = assessorCount + 1;
-- Адрес SOAP/Http для узла RequestHttp в качестве пункта назначения
SET OutputLocalEnvironment.Destination.HTTP.RequestURL = InputRoot.
MRM.soap11:Body.
fl3:requestAssessorAvailability.fl3:assessorList.fl3:assessors[assessorCount].
fl3:assessorURL;
-- Копирование данных сообщения из списка (f17 – синоним f14 – то же
пространство имен)
-- Выходные поля должны быть в том же порядке, что и элементы
SET OutputRoot.MRM.soap11:Body.fl7:requestAssessorAvailability.fl7:
claimID
= InputRoot.MRM.soap11:Body.fl3:requestAssessorAvailability.fl3:
claimID;
SET OutputRoot.MRM.soap11:Body.fl7:requestAssessorAvailability.fl7:
assessorID=
InputRoot.MRM.soap11:Body.fl3:requestAssessorAvailability.fl3:
assessorList.
fl3:assessors[assessorCount].fl3:assessorID;
SET OutputRoot.MRM.soap11:Body.fl7:requestAssessorAvailability.fl7:
cardet.
fl7:makeOfCar =
InputRoot.MRM.soap11:Body.fl3:requestAssessorAvailability.fl3:
makeOfCar;
SET OutputRoot.MRM.soap11:Body.fl7:requestAssessorAvailability.fl7:
cardet.
fl7:registration = 'JB 007'; -- Fixup as the registration wasn't
provided
SET OutputRoot.MRM.soap11:Body.fl7:requestAssessorAvailability.fl7:
location =
InputRoot.MRM.soap11:Body.fl3:requestAssessorAvailability.fl3:location;
SET OutputRoot.MRM.soap11:Body.fl7:requestAssessorAvailability.fl7:
reqDate =
InputRoot.MRM.soap11:Body.fl3:requestAssessorAvailability.fl3:
requiredDate;
SET OutputRoot.MRM.soap11:Body.fl7:requestAssessorAvailability.fl7:
responseTime=
InputRoot.MRM.soap11:Body.fl3:requestAssessorAvailability.fl3:
responseTime;
PROPAGATE;
END WHILE;
-- Все сообщения передаются явно, поэтому пустое сообщение не передается
RETURN FALSE;
END;
Flow4_Control_Message
Вычислительный узел Flow4_Control_Message передает выходное сообщение с терминала
Control узла Aggregate Control на узел MQOutput, который помещает его
в очередь, предназначенную для узла AggregateReply.
Все, что нам нужно сделать в этом модуле, – это создать сообщение WebSphere
MQ и передать ему сообщение, переданное от узла Aggregate Control в виде неструктурированного
XML-сообщения.
CREATE COMPUTE MODULE Flow4_PrepareMQControl
CREATE FUNCTION Main() RETURNS BOOLEAN
BEGIN
SET OutputRoot.MQMD.StrucId = MQMD_STRUC_ID;
SET OutputRoot.MQMD.Version = MQMD_CURRENT_VERSION;
SET OutputRoot.XML = InputRoot.XML;
RETURN TRUE;
END;
END MODULE;
Flow4_Save_AssessorRequest
После генерации сообщения-запроса мы сохраняем запрос к оценщику в базе данных
CLAIMASSESSOR, чтобы у нас было записанное узлом AggregateRequest значение
msgid. Обратите внимание, что мы сохраняем URL оценщика в Local Environment.
CREATE COMPUTE MODULE Flow4_Save_AssessorRequest
CREATE FUNCTION Main() RETURNS BOOLEAN
BEGIN
CALL CopyEntireMessage();
SET OutputLocalEnvironment = InputLocalEnvironment;
-- Сохраняем сообщение в таблице CLAIMASSESSOR
INSERT INTO Database.EMERGE.CLAIMASSESSOR (claimID, assessorID,
assessorURL,location, reqdate, makeofcar, registration, replytoq,
replytoqmgr,
correlid) VALUES (
InputRoot.MRM.soap11:Body.fl7:requestAssessorAvailability.fl7:
claimID,
InputRoot.MRM.soap11:Body.fl7:requestAssessorAvailability.fl7:
assessorID,
InputLocalEnvironment.Destination.HTTP.RequestURL,
InputRoot.MRM.soap11:Body.fl7:requestAssessorAvailability.fl7:
location,
InputRoot.MRM.soap11:Body.fl7:requestAssessorAvailability.fl7:
reqDate,
InputRoot.MRM.soap11:Body.fl7:requestAssessorAvailability.fl7:
cardet.fl7:makeOfCar,
InputRoot.MRM.soap11:Body.fl7:requestAssessorAvailability.fl7:
cardet.fl7:registration,
'NoReplytoQ',
'NoReplytoQmgr',
-- Сохранение корреляционного маркера из id сгенерированного сообщения
InputLocalEnvironment.WrittenDestination.MQ.DestinationData.msgId);
RETURN TRUE;
END;
Flow3a_Prepare_Reply
Узел Flow3a_Prepare_Reply получает ответы с информацией о готовности от оценщиков.
Его функция – извлечь для узла Aggregate Reply идентификатор ответа и создать
сообщение-запрос WebSphere MQ, которое будет послано узлу MQ Reply для возврата
реального сообщения-ответа с правильной корреляционной информацией. В
примере 9.13 приводится SQL-код, решающий эти задачи.
CREATE COMPUTE MODULE Flow3a_Prepare_Reply
CREATE FUNCTION Main() RETURNS BOOLEAN
BEGIN
SET OutputRoot = InputRoot;
SET OutputRoot.HTTPInputHeader = null;
SET OutputRoot.HTTPResponseHeader = null;
-- Создание MQ-сообщения-запроса – оно будет преобразовано в ответ в
MQReply
CREATE NEXTSIBLING OF OutputRoot.Properties domain 'MQMD';
SET OutputRoot.MQMD.StrucId = MQMD_STRUC_ID; -- create MQMD
SET OutputRoot.MQMD.Version = MQMD_CURRENT_VERSION;
SET OutputRoot.MQMD.Format = ' ';
SET OutputRoot.MQMD.Report = MQRO_COPY_MSG_ID_TO_CORREL_ID;
SET OutputRoot.MQMD.MsgType = MQMT_REPLY;
-- Тот же msgid как в сообщении-запросе, сохраненном в таблице Claim-
Assessor. MQReply скопирует его в correlid
SET OutputRoot.MQMD.MsgId =
THE (SELECT ITEM A.correlid FROM Database.EMERGE.CLAIMASSESSOR AS A
WHERE A.assessorID =
InputRoot.MRM.soap11:Body.fl8:assessorAvailability.fl8:assessorID
AND A.claimID =
InputRoot.MRM.soap11:Body.fl8:assessorAvailability.fl8:claimID);
SET OutputRoot.MQMD.ReplyToQ = 'AggIn';
RETURN TRUE;
Этот код очищает все HTTP-данные, создает MQMD и конфигурирует его как сообщение-запрос с исходным MsgId.
Flow3a_Generate_Output3a
Модуль Flow3a_Generate_Output3a создает результирующее сообщение Flow3a, включающее
список оценщиков, возвращаемый процессу ExternalClaimAssessor.
Объединенное сообщение сохраняется в массиве ComIbmAggregateReplyBody.
Flow4. По некоторым причинам нужно переустановить значение MessageSet в свойствах
(Properties). Значение то же, которое мы устанавливали для всех входных папок.
CREATE COMPUTE MODULE Flow3a_Generate_Output3a
CREATE FUNCTION Main() RETURNS BOOLEAN
BEGIN
-- Сколько ответов получено? Папка Flow4 определена в узле Aggregate
Request?
DECLARE noofreplies INTEGER
CARDINALITY(InputRoot.ComIbmAggregateReplyBody.Flow4[]);
DECLARE replyno INTEGER 1;
DECLARE assessorID INTEGER;
SET OutputRoot.Properties =
InputRoot.ComIbmAggregateReplyBody.Flow4.Properties;
SET OutputRoot.Properties.MessageSet = 'PIJ0MIK002001';
IF noofreplies > 0 THEN
SET OutputRoot.MRM.soap11:Body.fl3a:AvailableAssessorsList.claimID =
InputRoot.ComIbmAggregateReplyBody.Flow4[replyno].MRM.soap11:Body.fl8:
assessorAvailability.fl8:claimID;
WHILE noofreplies >= replyno DO
SET assessorID = InputRoot.ComIbmAggregateReplyBody.
Flow4[replyno].
MRM.soap11:Body.fl8:assessorAvailability.fl8:assessorID;
SET
OutputRoot.MRM.soap11:Body.fl3a:AvailableAssessorsList.resultAssessor-
Collection[
replyno].assessorEstimations.assessorID = assessorID;
-- assessorURL отсутствует в ответе, поэтому нужно брать его из базы
данных
SET
OutputRoot.MRM.soap11:Body.fl3a:AvailableAssessorsList.resultAssessor-
Collection[
replyno].assessorEstimations.assessorURL = THE (SELECT ITEM A.assessor
URL FROM
Database.EMERGE.CLAIMASSESSOR AS A WHERE A.assessorID = assessorID);
SET
OutputRoot.MRM.soap11:Body.fl3a:AvailableAssessorsList.resultAssessorCo
llection[replyno].assessorEstimations.preCost =
InputRoot.ComIbmAggregateReplyBody.Flow4[replyno].
MRM.soap11:Body.fl8:assessorAvailability.fl8:predCost;
SET
OutputRoot.MRM.soap11:Body.fl3a:AvailableAssessorsList.resultAssessorCo
llection[replyno].assessorEstimations.preDate =
InputRoot.ComIbmAggregateReplyBody.Flow4[replyno].
MRM.soap11:Body.fl8:assessorAvailability.fl8:predDate;
SET replyno = replyno + 1;
END WHILE;
RETURN TRUE;
ELSE
-- Не передавать сообщение, если ответов нет
RETURN FALSE;
END IF;
END;
9.7.2 Динамическая установка пункта назначения SOAP/Http
В примере 9.15 модуль Flow7_Set_SOAP_address задает пункт назначения SOAP/http
для использования узлом HTTPRequest при отправке запроса за оценку выбранному
оценщику. URL оценщика (assessorURL) находится во входном сообщении потока
Flow6, но он не копируется в сообщение Flow7, посылаемое оценщику, поэтому
ESQL-код получает его из входного сообщения потока Flow6.
CREATE COMPUTE MODULE Flow7_Set_SOAP_address
CREATE FUNCTION Main() RETURNS BOOLEAN
BEGIN
CALL CopyEntireMessage();
-- Нам нужно задать URL AllocateAssessmentRequest. Определен
--только URL AssessorAvailabilityRequest
-- Быстрое исправление состоит в наличии соглашения об именах...
SET OutputLocalEnvironment.Destination.HTTP.RequestURL =
REPLACE(InputRoot.MRM.soap11:Body.fl6:actionAssessor.fl6:assessor.
fl6:assessorURL,'Availability','DeliverAssessment');
RETURN TRUE;
END;
9.7.3 Объявления общих префиксов пространств имен
В табл. 9.11 приведен модуль пространств имен.
Модуль общих пространств имен
| ESQL-модуль |
Описание |
| common |
Объявление пространств имен и префиксов |
Хорошей практикой является указание укороченных префиксов для пространств
имен, используемых в коде ESQL. При этом инструкции становятся более короткими
и удобными для чтения. Пространства имен будут находиться в наборе сообщений
Assessor, который мы создали ранее. Если есть какие-то пропущенные или дублирующиеся
префиксы, сейчас можно изменить или добавить их. Одинаковым пространствам
имен нужно присваивать одинаковые префиксы. Мы соблюдали осторожность
при редактировании файлов схем, чтобы все они содержали разные префиксы перед
их преобразованием в наборы сообщений. Результаты можно увидеть на рис 9.109.
В навигаторе ресурсов выберите элемент Assessor Messageset $$\to$$ Assessor, выберите
файл messageSet.mset и перейдите на закладку XML1 в редакторе набора сообщений.
(рис 9.109) Добавление префикса к объявлению пространства именПримечание. Если используются схемы с одинаковыми пространствами имен, дублирующиеся
пространства имен и префиксы отбрасываются брокером сообщений.
Добавьте пространства имен и префиксы из каждого набора сообщений в модуль
common.eqsl, как показано в примере 9.16. Обратите внимание, что там, где у нас
пространства имен дублируются, мы не можем объявлять дублирующиеся префиксы.
BROKER SCHEMA proxyAssessorSystem
DECLARE soap11 NAMESPACE 'http://schemas.xmlsoap.org/soap/envelope/';
DECLARE fl3 NAMESPACE 'http://broker.lgi.itso.assessavail';
DECLARE fl3a NAMESPACE 'http://AssessorAvailabilityList.itso';
DECLARE fl7 NAMESPACE 'http://assessor.itso';
DECLARE fl8 NAMESPACE 'http://assbroker.lgi.itso';
DECLARE fl6 NAMESPACE 'http://broker.lgi.itso.allocreq';
DECLARE fl6a NAMESPACE 'http://AllocateAssessorResponse.lgi.itso';
-- DECLARE fl4a NAMESPACE 'http://assbroker.lgi.itso';
-- DECLARE fl7a NAMESPACE 'http://assbroker.lgi.itso';
-- DECLARE f4 NAMESPACE 'http://assbroker.itso';
-DECLARE fl9 NAMESPACE 'http://broker.lgi.itso.assessrept';
Совет. При изменении префиксов пространств имен или при редактировании файла common.
esql предупреждающие сообщения могут непредсказуемым образом попадать в список задач,
относящихся к нерешенным ссылкам на поля сообщений. Если перестройка всего рабочего
пространства не помогает избавиться от предупреждений, закройте рабочее пространство,
откройте его снова и опять полностью перестройте.
9.7.4 ESQL-код для обработки ошибок
В табл. 9.12 перечислены проверочные модули, которые нужно написать, и общий
обработчик ошибок. Проверочные модули мало отличаются друг от друга.
Проверочные ESQL-модули
| ESQL-модуль |
Описание |
| Flow3_Validate |
"Специфичная для потока" проверка входного сообщения |
| Flow4a_Validate |
| Flow6_Validate |
| Flow7a_Validate |
| Flow8_Validate |
| fault_identify_fault |
Общий обработчик SOAP-ошибок |
На примере модуля Flow3_Validate показана одна из этих процедур.
Flow3_Validate
Все проверочные процедуры строятся по одному образцу:
Настройка параметров вызова процедуры ValidateMessage в папке с глобальными
данными брокера Environment:SOAP-сообщение, которое ожидается в Environment.Message;
флаг, показывающий, что сообщение-исключение задается в этом модуле, а не в общем обработчике ошибок SOAP;
ссылки на папки, передаваемые процедуре ValidateMessage.
Вызов процедуры ValidateMessage и проверка возвращаемого флага.передача Inputroot на Outputroot, если проверка проходит успешно;
если проверка заканчивается неудачно, генерируется исключение со специфическими данными об ошибке, которое будет перехватываться входным узлом в начале потока и передаваться в общий обработчик ошибок.
Мы используем типичное сообщение об ошибке SOAP для хранения исключения,
поскольку не все WSDL, с которыми мы работаем, будут иметь интерфейс ошибок.
Ошибка должна возвращаться, только если Web-служба имеет интерфейс ошибок.
В примере 9.17 показан код для проверки в потоке Flow3.
CREATE COMPUTE MODULE Flow3_Validate
CREATE FUNCTION Main() RETURNS BOOLEAN
BEGIN
DECLARE xInputRoot REFERENCE TO InputRoot;
SET Environment.Message = 'requestAssessorAvailability';
-- В следующей инструкции регистрируется факт, что Web-служба генерирует
-- свое сообщение об исключении, а не использует ошибку SOAP по умолчанию
SET Environment.SOAP.Fault.FaultOption = 'CustomizedFault';
DECLARE xEnvironment REFERENCE TO Environment;
-- Проверка сообщения
CALL ValidateMessage(xInputRoot, xEnvironment);
IF Environment.SOAP.Fault.FaultCode = ' ' THEN
SET OutputRoot = InputRoot;
ELSE
-- Web-служба генерирует свое сообщение об ошибке... Это оно, и за
-- ним идет путь исключения
SET Environment.soap11:Body.Fault.faultstring =
'Flow3 input message validation failed... claimID ' ||
CAST(InputBody.soap11:Body.fl3:requestAssessorAvailability.fl3:
claimID AS
CHARACTER);
THROW USER EXCEPTION VALUES ('Flow3 Input validation failed');
END IF;
RETURN TRUE;
END;
Оставшаяся часть проверочных модулей
Скопируйте код из примера Flow3_Validate и внесите изменения, показанные
в табл. 9.13, в каждую из копий.
В каждой ESQL-реализации вычислительного узла Validate нужно изменить код,
помеченный выше жирным шрифтом.
Вставка переменных в процедуры проверки
| Поток |
Сообщение |
Поле ClaimID |
| Flow3 |
requestAssessorAvailability |
fl3:requestAssessorAvailability.fl3:claimID |
| Flow4a |
assessorAvailability |
fl4a:assessorAvailability.fl4a:claimID |
| Flow6 |
actionAssessor |
fl6:actionAssessor.fl6:claimID |
| Flow7a |
assessorResponse |
fl7a:assessorResponse.fl7a.claimID |
| Flow8 |
receiveAssessorReport |
fl8:receiveAssessorReport.fl8:claimID |
Fault_Identify_Fault
Модуль Fault_Identify_Fault (пример 9.18) предназначен для форматирования пакета
с данными об ошибке SOAP, содержащего полезные для диагностики сведения. Модуль
Main – это просто выход, если пакет уже создан. Выходные данные посылаются
узлу HttpReply для возврата SOAP-клиенту, в противном случае вызывается процедура
FaultProc, которая создает пакет с данными об ошибке.
CREATE FUNCTION Main() RETURNS BOOLEAN
BEGIN
IF Environment.SOAP.Fault.FaultCode = 'FaultReceived' THEN
-- Получена ошибка от другой Web-службы.... копируем данные на выход
SET OutputRoot = InputRoot;
ELSE
CALL FaultProc();
END IF;
RETURN TRUE;
END;
Процедура faultproc, приведенная в примере 9.19,
содержит восемь разделов. Она
компонует сведения об ошибке, в зависимости от того, какая информация об этой
ошибке доступна.
CREATE PROCEDURE FaultProc()
BEGIN
-- 1. Для Web-службы требуется типичное сообщение об ошибке SOAP
CALL CopyMessageHeaders();
SET OutputRoot.HTTPInputHeader = null;
SET OutputRoot.HTTPResponseHeader = null;
-- 2. Укажем подходящие значения для неопознанной ошибки в конфигура-
-- ционных данных службы
IF Environment.SOAP.Fault.FaultCode IS NULL OR
Environment.SOAP.Fault.FaultCode = ' '
THEN
SET Environment.SOAP.Fault.FaultActor ='proxyAssessorSystem';
SET Environment.SOAP.Fault.FaultCode = 'Server';
SET Environment.SOAP.Fault.FaultString = 'Server error in SOAP Web
service';
END IF;
-- 3. Создадим выходное сообщение об ошибке SOAP (MRM)
SET OutputRoot.Properties.MessageSet = 'Assessor';
SET OutputRoot.Properties.MessageType = 'Envelope';
SET OutputRoot.Properties.MessageFormat = 'XML1';
-- 4. Выводится MRM-сообщение. Добавим стандартный SOAP-конверт
-- Явно добавим пространство имен к значению кода ошибки
-- Поместим в данные об ошибке тело исходного сообщения (если возмож-
-- но... )
-- 5. Web-служба требует пользовательского сообщения об ошибке
IF Environment.SOAP.Fault.FaultOption = 'CustomizedFault' THEN
SET OutputRoot.MRM.soap11:Body.soap11:Fault.faultcode =
'soap11'||':'||
Environment.SOAP.Fault.FaultCode;
SET OutputRoot.MRM.soap11:Body.soap11:Fault.faultstring =
Environment.SOAP.Fault.FaultString;
SET OutputRoot.MRM.soap11:Body.soap11:Fault.faultactor =
Environment.SOAP.Fault.FaultActor;
SET OutputRoot.MRM.soap11:Body.soap11:Fault.detail =
Environment.soap11:Body;
ELSE
-- 6. Web-служба требует заданное по умолчанию сообщение об ошибке SOAP
SET OutputRoot.MRM.soap11:Body.soap11:Fault.faultcode = 'soap11'||':'||
Environment.SOAP.Fault.FaultCode;
SET OutputRoot.MRM.soap11:Body.soap11:Fault.faultstring =
Environment.SOAP.Fault.FaultString;
SET OutputRoot.MRM.soap11:Body.soap11:Fault.faultactor =
Environment.SOAP.Fault.FaultActor;
IF InputExceptionList.ParserException.ParserException.ParserException.
Number=5117
THEN
SET OutputRoot.MRM.soap11:Body.soap11:Fault.detail.OriginalBody =
'Input message is not valid XML';
ELSE
SET OutputRoot.MRM.soap11:Body.soap11:Fault.detail.OriginalBody =
InputRoot.*[<];
END IF;
-- 7. Проверяем, является ли список исключений результатом выполнения
-- ESQL THROW...
IF InputExceptionList.RecoverableException.RecoverableException.User-
Exception.Number = 2951 THEN
-- 8. Если нет, выводим список исключений в сообщение об ошибке SOAP
ELSE
SET OutputRoot.MRM.soap11:Body.soap11:Fault.detail.ExceptionList =
InputExceptionList;
END IF;
END IF;
END;
9.8 Размещение набора сообщений и потоков
Наша следующая задача – это размещение наборов сообщений и потоков для их
последующего тестирования, но сначала нам нужно реализовать URL: http://SAH414A:7080/UNKNOWN,
который был определен в потоках 4 и 7 как URL оценщика
по умолчанию на случай, если поток не сможет задать URL оценщика динамически.
Это одна из ситуаций из разряда "этого не должно случиться никогда", и поэтому мы
ля ее обработки используем тривиальный поток брокера.
9.8.1 Создание потока UNKNOWN
В проекте потока сообщений CommonSOAPHttpFlows создайте новый поток
сообщений UnknownAssessor (рис 9.110).
(рис 9.110) Поток UNKNOWNПеретащите в поток узел HttpInput и подпоток Fault и задайте свойства узла HttpInput
следующим образом:
Закладка Basic (Общие):в поле URL Selector (Выбор URL) укажите http://SAH414A:7080/UNKNOWN;
в поле Client Wait Time (Время ожидания клиента) укажите 30 секунд.
Закладка Default (По умолчанию):Message domain (Домен сообщений): MRM;
Message Set (Набор сообщений): Assessor;
Message Type (Тип сообщений): Envelope;
Message Format (Формат сообщений): XML1;
Закладка Validation (Проверка):Validate (Проверять): Content and Value (Содержимое и значение);
Failure Action (Действие при ошибке): Exception (Исключение).
9.8.2 Создание архива брокера
Чтобы разместить потоки и набор сообщений, нам нужно создать архив брокера
(Broker Archive, bar-файл) и указать, какие потоки и наборы сообщений будут в него
входить. Для простоты мы определили один .bar-файл, содержащий все, что нам нужно,
и разместили его в одной группе выполнения на одном брокере. Если бы нам, например,
захотелось разместить потоки Assessor Availability отдельно от потоков
Assessor Report, мы бы создали два архива брокера.
Переключитесь на перспективу Broker Administration (Администрирование брокера).
Щелкните правой кнопкой мыши по элементу Broker Archives (Архивы брокера), выберите пункт меню New (Новый) > Message Broker Archive (Архив брокера сообщений), присвойте новому файлу имя Assessor и нажмите Finish (Готово).
В редакторе .bar-файлов [панель . Нажмите Finish (Готово).
Нажмите Details (Подробно) в диалоговом окне, чтобы проверить наличие ошибок. Нажмите (рис 9.111) Создание файла Assessor.barПолучившийся архив выглядит так, как показано на рис 9.112. Обратите
внимание, что отображаются только потоки с входными (Input) узлами.
(рис 9.112) Файл Assessor.bar
Сохраните файл Assessor.bar.
Совет. Вы можете открыть .bar-файл с помощью инструмента для работы с .zip-файлами
и изучить его содержимое. Одной из полезных хитростей, о которой вам может сказать
специалист по брокеру, является то, что, если у вас возникают проблемы с SQL-кодом,
сгенерированным узлами для работы с базами данных в потоках сообщений, вам следует
изучать SQL-код в bar-файле, а не в формате .xmi в перспективе Development (Разработка)
рабочего места. Вы можете увидеть здесь то, что в действительности было размещено. Вы
также можете обнаружить, что SQL-код стало проще читать, поскольку некоторые
символические значения были решены. См. пример 9.20.
CREATE PROCEDURE Flow3a_DataUpdate (IN s_Envelope REFERENCE
{'http://schemas.xmlsoap.org/soap/envelope/'}:Envelope)
BEGIN
--$IBM_WBIMB_XMIID=UpdateStatement_1
UPDATE Database.EMERGE.CLAIMASSESSOR AS "T#"
--$IBM_WBIMB_XMIID=UpdateStatement_1#assignments
SET PREDCOST = s_Envelope.soap11:Body.fl8:assessorAvailability.fl8:
predCost,
PREDDATE = s_Envelope.soap11:Body.fl8:assessorAvailability.fl8:predDate
WHERE "T#".CLAIMID =
s_Envelope.soap11:Body.fl8:assessorAvailability.fl8:claimID AND
"T#".ASSESSORID =
s_Envelope.soap11:Body.fl8:assessorAvailability.fl8:assessorID ;
END;
Размещение файла Assessor.bar в брокере
Запустите сервер с брокером сообщений, если вы этого еще не сделали. Обратитесь
к разделу 7.2.5, "Инсталляция и конфигурирование брокера сообщений" и установите
соединение с брокером через инструментарий. Обратите внимание на раздел "Конфигурация инструментария".
В перспективе Broker Administration (Администрирование брокера) откройте
представление Domain (Домен) и щелкните правой кнопкой мыши по элементу WBRK_BROKER. Выберите пункт меню New (Новая) $$\to$$ Execution Group (Группа
выполнения), назовите группу выполнения Assessor и нажмите Finish (Готово)
(рис 9.113).
(рис 9.113) Создание группы выполнения Assessor
Перетащите файл Assessor.bar в новую группу выполнения. Изучите подробные
сведения в появившемся окне, нажмите OK.
Сделайте двойной щелчок мышью по журналу событий (Event log) в представлении
Domain (Домен). Изучите открывшийся журнал FMCQM (рис 9.114). При выборе
сообщения отображается его содержимое. Если вы точно следовали инструкциям,
ошибок быть не должно.
(рис 9.114) Проверка журнала событий
Обновите группу выполнения в представлении Domains (Домены). Результат показан
на рис 9.115.
(рис 9.115) Группа выполнения Assessor после размещения
9.9 Модульное тестирование размещенных потоков
Для тестирования размещенных потоков необходимы:
Инструмент тестирования для отправки и получения образцов SOAP-сообщений
Каркас системы для работы с оценщиками и претензиями. Можно использовать образец приложения для оценщиков, работающий на WebSphere Application Server.
Знание методов трассировки и отладки потоков WebSphere Business Integration Message Broker.
9.9.1 Инструменты для тестирования
Существует несколько клиентских SOAP-инструментов для тестирования. Наиболее
доступным и универсальным является Web services Explorer (рис 9.116), входящий
в пакеты WebSphere Studio Application Development Integration Edition и Rational Software
Architect. Этот инструмент позволяет загрузить WSDL-файл и изменять его части,
например адрес Web-службы. В него входят представления Form (Форма) и Trace
(Трассировка) для просмотра содержимого сообщений-запросов и ответов. Обе эти
рабочие среды содержат также TCP-монитор, с помощью которого можно увидеть,
какие данные реально передаются.
(рис 9.116) Использование Web services Explorer для тестирования WebSphere Business Integration Message Broker
9.9.2 Каркас системы оценщика и системы для работы с претензиями
Создать каркас системы оценщика и системы для работы с претензиями для тестирования
системы proxyAssessorSystem очень легко. Одна из сложностей, связанных
с системой оценщика, состоит в том, что она работает асинхронно и возвращает два
сообщения в ответ на запрос к выбранному оценщику. Сложно запрограммировать
в EJB определенные и неопределенные задержки.
Альтернативой является создание потока сообщений в брокере и имитация задержки
путем помещения сообщений WebSphere MQ в приостановленные очереди
с освобождением сообщений только по требованию (флаг Get Inhibit).
На рис 9.117 показан базовый каркас системы готовности оценщика. Этот поток
посылает HTTP-ответ, а затем отправляет сообщение о готовности оценщика. Узлы
Mapping позволяют легко сформировать правильное содержимое сообщений. Трассировочные
узлы дают возможность отлаживать и проверять решение.
(рис 9.117) Поток базового каркаса для системы отправки данных о готовности оценщикаНа рис 9.118 показан базовый каркас системы отправки отчета оценщика. Структура
практически аналогична предыдущей, но на этот раз после ответа выполняются
два потока, которые посылают подтверждение, а затем сам отчет. Запросы помещаются
в очереди WebSphere MQ. Два других потока принимают запросы из очередей,
когда флаг Get Inhibit сбрасывается при помощи инструмента MQ Explorer, а затем
генерируют HTTP-запросы, посылаемые в систему proxyAssessorSystem.
(рис 9.118) Поток базового каркаса для системы отправки отчетов оценщика
9.9.3 Потоки трассировки и отладки
Существует три основных метода отладки потоков WebSphere Business Integration
Message Broker: использование трассировки, использование трассировочных узлов
и отладчик в рабочей среде.
Одной из лучших функциональностей WebSphere Business Integration Message
Broker является возможность отладки. Соответствующие инструменты помогают визуализировать
все данные, проходящие от угла к узлу, и, если вы захотите, вы можете
с помощью средств трассировки получить полную распечатку функционирования
потоков, можете использовать трассировочные узлы для регистрации части операций
или можете с помощью отладчика пошагово проходить разделы потока или
SQL-кода с интерактивной модификацией данных в ходе выполнения.
Трассировка
Управление трассировкой осуществляется из командной строки, и она работает на
уровне групп выполнения. Вы можете изменить уровень трассировки и трассировать
отдельные потоки, для чего нужно установить опции в представлении Domains (Домены)
рабочей среды.
Приведенные ниже пять скриптов помогут быстро выполнить трассировку.
Скрипт ClearAtrace (пример 9.21) и скрипт GetAtrace
(пример 9.22) работают
с интерфейсами брокера. Уровень трассировки, установленный, например, с помощью
средств рабочей среды, остается без изменений. Скрипты ClearTraces и GetTraces
(примеры 9.23 и 9.24)
содержат списки исследуемых групп выполнения, а скрипт (пример 9.25)
сводит все эти скрипты в одну команду, запускаемую каждый раз, когда
нужно выполнить трассировку.
@rem очистка трассировочного журнала
@SETLOCAL
@rem первый аргумент – имя брокера, а второй – группа выполнения
@mqsichangetrace %1 -u -e %2 -r
@echo Tracing options for execution group %2 running on broker %1
@mqsireporttrace %1 -u -e %2
@ENDLOCAL
@rem Получение данных в трассировочный журнал
@SETLOCAL
@rem первый аргумент – имя брокера, а второй – группа выполнения
@mqsireadlog %1 -u -e %2 -o %2.xml
@mqsiformatlog -i %2.xml -o %2.txt
@start notepad %2.txt
@ENDLOCAL
@SETLOCAL
@Call ClearAtrace WBRK_BROKER LGIAvailability
@Call ClearAtrace WBRK_BROKER LGIReport
@Call ClearAtrace WBRK_BROKER Assessor
@ENDLOCAL
@SETLOCAL
@Call GetAtrace WBRK_BROKER LGIAvailability
@Call GetAtrace WBRK_BROKER LGIReport
@Call GetAtrace WBRK_BROKER Assessor
@Call ClearTraces
@ENDLOCAL
@SETLOCAL
@Call GetTraces
@Call ClearTraces
@ENDLOCAL
Трассировочные узлы
Трассировочные узлы (
) можно вставлять в любое место потока или
присоединять параллельно к другому выходному коннектору.
На рис 9.119 показан типичный трассировочный узел. Он сконфигурирован на
вывод в журнал событий Windows события, которое выглядит как Error 3096 и содержит
информацию из дерева сообщений, локального окружения (LocalEnvironment),
списка исключений и окружения (Environment). Не имеет никакого значения, если
какие-то данные в период выполнения оказываются пустыми. Используйте SQL-выражения
для формирования выводимых данных, ведь для отладки большой объем дампа
весьма полезен.
(рис 9.119) Типичный трассировочный узелНомер сообщения (Message number) выбирается из предустановленного каталога
из зарезервированного диапазона (3051-3099), и для него существует заранее заданное
сообщение. Можно определять дополнительные каталоги и сообщения, но для
отладки имеющийся каталог сообщений вполне подходит.
Обычной процедурой является вызов консоли управления Windows (Windows
Management Console) и просмотр журнала приложений. Очистите журнал перед
запуском трассировки, и, если вы правильно выбрали номера сообщений, процесс
выполнения можно легко проследить по трассировочным событиям, появляющимся
в журнале.
Отладка
Последней технологией, которую мы опишем, является традиционная пошаговая отладка.
Откройте перспективу Flow Debug (Отладка потока), которая отображается в виде
красного жучка (
). Диалоговое окно
поможет вам подключиться к брокеру, а затем – к одной или нескольким группам выполнения,
а также расставить точки останова. Обратите внимание, что кнопка, на которую нужно нажимать,
чтобы выполнить шаг в ESQL-коде, отличается от кнопки, которую нужно нажать, чтобы выполнить шаг
в потоке сообщений, и ее часто не замечают (рис 9.120).
(рис 9.120) Точка останова в потоке сообщений с возможностью трассировки ESQLВ окнах переменных отображаются значения переменных при прохождении ESQL-кода
в вычислительном узле. Если в вашем потоке нет кода ESQL, отладчик будет
не слишком полезен. В окне переменных есть специальная папка Debug Message,
в которой отображаются все доступные в потоке данные (рис 9.121).
(рис 9.121) Debug MessageВ окнах переменных отображаются значения переменных при прохождении ESQL-кода
в вычислительном узле. Если в вашем потоке нет кода ESQL, отладчик будет
не слишком полезен. В окне переменных есть специальная папка Debug Message,
в которой отображаются все доступные в потоке данные (рис 9.121).
В этой лекции описывается создание посреднических (брокерных) компонентов
корпоративной сервисной шины (enterprise service Bus, ESB).
Сначала мы опишем место, которое занимает ESB в архитектуре решения,
и возможности, которые должен предоставить брокер (раздел 9.1). В следующем
разделе – 9.2, "WebSphere Business Integration Message Broker" – коротко
описывается концепция брокера сообщений и его основные компоненты.
Проектирование компонентов решения описывается в разделе 9.3, "Проектирование
компонентов". В следующих пяти разделах детально описывается реализация:
9.4, "Реализация наборов сообщений";
9.5, "Реализация таблиц баз данных";
9.6, "Создание потоков сообщений";
9.7, "Создание кода ESQL для потоков сообщений";
9.8, "Размещение набора сообщений и потоков".
Например, мы опишем, как следует тестировать и отлаживать потоки сообщений.
9.1 Архитектура
Здесь мы повторим, какое место занимает ESB в архитектуре системы и решения.
Архитектура системы
На рис 9.1 показана архитектура системы работы с внешними оценщиками. Возвращаясь
к обсуждению, приводимому в лекции 5, "Архитектура системы", поскольку мы
используем версию 5 платформы WebSphere, мы решили ограничить ESB шаблоном
Extended Enterprise, а для интеграции приложений применить шаблон Application
Integration. Шаблон Extended Enterprise отвечает за потоки, идущие к внешним оценщикам
и от них. В версии 6 платформы WebSphere мы намереваемся расширить ESB,
и включить в нее все компоненты решения, используя надежные соединения между
всеми службами.
(рис 9.1) Система работы с внешними оценщиками: связь с продуктамиЗадача, которую мы ставим для данной лекции, – это реализация служб маршрутизации
и объединения, а также установление соединения между зоной LGI и внешними
оценщиками. И снова, исключительно из соображений экономии ресурсов, мы не
уделяем внимания реализации шлюза Web-служб, безопасности и различным типам
соединения с оценщиками, таким, как браузер, EDI, передача файлов, электронная
почта, факс или взаимодействие Web-служб.
Если изучить рис 9.1 более детально, то видно, что мы используем брокер сообщений
для выполнения двух функций, которым соответствуют квадраты с буквами А и В.
Предлагаются специфические службы маршрутизации, распределения и объединения для ESB:Брокер отвечает за создание адресов для маршрутизации запросов к конкретным
оценщикам с учетом протокола, качества обслуживания и местонахождения
оценщика и за размещение запроса в соответствующем транспортном соединении.
Если исходная технология соединения не обеспечивает качества
обслуживания, необходимого для брокера, то брокер отвечает за наилучшее
использование возможностей соединения.Технология соединений, используемая брокером, почти всегда связана с ретрансляцией
адреса пункта назначения. Это может быть шлюз Web-служб, реализующий
для адреса функции прокси из соображений удобства использования
и обеспечения безопасности, или DNS-служба, преобразующая имя хоста в IP-адрес.
За маршрутизацию отвечает не только брокер. Ему нужно взаимодействовать
со службами, относящимися к технологии соединения. Сам же он обеспечивает
стабильный интерфейс служб для любых компонентов, которые либо сами реализованы
как службы, либо заключены сервисной шиной в службы-оболочки.
Частью возможностей, которые дает сервисная шина, являются посреднические
функции. Посреднические функции обеспечивают гибкость при установлении
соответствий между логическими и физическими интерфейсами служб.
Эти функции могут быть простыми, например изменение порядка параметров
службы, или сложными, связанными с изменением данных, преобразованием
данных и преобразованием типов. Нам потребуются довольно сложные формы
посреднических функций, такие, как соответствие "один ко многим"
и "многие к одному", т. е. распространение и объединение (агрегация).Запрос на оценку принимается ( А ) от процесса RequestExternalAssessment в виде
единичного запроса от службы, в котором содержится список потенциальных
оценщиков. Список разделяется на отдельные запросы, которые посылаются
индивидуальным оценщикам ( В ). Через определенный период времени
оценщики возвращают ответы ( С ). Когда согласованный в контракте промежуток
времени истекает, брокер объединяет (агрегирует) полученные запросы
и вызывает службу ответа, предоставленную процессом RequestExternalAssessm
ent, передавая в нее единый список ответов от оценщиков ( D ). Ответы, пришедшие
слишком поздно, отбрасываются ( Е ).
Еще одна возможность – это обеспечение шины различными формами транспортных
протоколов. В WebSphere Business Integration Message Broker поддерживается
несколько протоколов связи, и мы собираемся работать в Web-службами, используя
протоколы SOAP/http и SOAP/http через WebSphere MQ. Дизайн потоков в брокере
позволяет службам связываться, используя любой протокол.
(рис 9.2) Схематическое изображение распределения, агрегации и маршрутизации в брокере
Архитектура решения
Схема последовательностей, приведенная на рис 9.3, показывает взаимодействия
с компонентом ESB proxyAssessorSystem. Взаимодействия, выделенные красным цветом,
отражают службы, которые предоставляет компонент proxyAssessorComponent.
(рис 9.3) Схема последовательностей proxyAssessorAutomationВзаимодействия описаны в табл. 6.1. В табл. 9.1
(созданной на основе табл. 6.2)
приводится общий обзор взаимодействий системы proxyAssessorAutomation и идентифицируются
WSDL-файлы, определяющие службы. Система proxyAssessorSystem отмечается
там, где она отвечает за предоставление служб. Для взаимодействий системы
proxyAssessorSystem нужно разработать сервисные потоки, а для других систем – клиентские потоки.
Сведения о WSDL-файлах
| Поток |
Компонент |
Данные об интерфейсе – имя WSDL-файла |
| 3 |
Proxy Assessor System |
AssessorAvailability(3).wsdl |
| 4 |
Assessor |
Availability(4).wsdl |
| 4a |
Proxy Assessor System |
AssessorAvailabilityPT(4a).wsdl |
| 3a |
Assessor Automation |
AssessorAvailablityList(3a).wsdl |
| 6 |
Proxy Assessor System |
AllocateAssessmentReport(6).wsdl |
| 7 |
Assessor |
DeliverAssessment(7).wsdl |
| 7a |
Proxy Assessor System |
DeliverAssessmentResponse(7a).wsdl |
| 6a |
Assessor Automation |
AllocateAssessorResponse(6a).wsdl |
| 8 |
Proxy Assessor System |
AssessorReport(8).wsdl |
| 9 |
Assessor Automation |
AssessorReport(9).wsdl |
9.2 WebSphere Business Integration Message Broker
WebSphere Business Integration Message Broker – это продукт, выполняющий функции
брокера сообщений в семействе продуктов WebSphere Business Integration. Это семейство
состоит из нескольких серверных продуктов, которые на различных уровнях
играют роли, связанные с интеграцией.
Брокер относится к уровню служб, обеспечивающих в архитектуре бизнес-интеграции
WebSphere связь приложений (Application Connectivity Services)(рис 9.4). Этот
уровень выполняет такие функции, как маршрутизация, посредничество, трансформация
и публикация/подписка. Эти функции, как правило, осуществляются "поверх"
инфраструктуры обмена сообщениями, такой, как WebSphere MQ.
(рис 9.4) Образец архитектуры бизнес-интеграции WebSphereПри переходе с архитектуры, ориентированной на сообщения, к сервис-ориентированной
архитектуре, брокер приобретает новую роль. Он служит мостом между
традиционными методами интеграции приложений, использующими адаптеры
и промежуточное программное обеспечение, ориентированное на сообщения, и развивающимся
миром интеграции служб, использующих сервисные шины. Начиная
с версии 5, брокер предлагает интеграцию времени выполнения с транспортным
протоколом SOAP/http.
Гибкость модели обмена сообщениями и инструментария брокера означает, что
в потоках сообщений брокера могут предоставляться и использоваться SOAP-службы.
Именно эту возможность мы собираемся использовать для предоставления SOAP-служб
через HTTP, и ее можно легко адаптировать к JMS.
9.2.1 Компоненты брокера сообщений
WebSphere Business Integration Message Broker V5 состоит из следующих компонентов:
инструментарий Message Brokers Toolkit для WebSphere Studio – новая возможность, заменившая центр управления (Control Center) WebSphere MQ Integrator V2.1, а также имеющая расширенные возможности во многих новых областях;
менеджер конфигураций (Configuration Manager), содержащий хранилище для конфигураций и сообщений;
брокеры сообщений (Message broker) – компонент рабочей системы, состоящий из групп выполнения, которые содержат размещенные потоки сообщений;
функция публикация/подписка;
менеджеры очередей WebSphere WebSphere MQ, которые формируют базовую транспортную инфраструктуру для WebSphere Business Integration Message Broker;
прикладные пользовательские программы, которые генерируют сообщения и запрашивают их для проведения трансформации и маршрутизации в другие точки назначения внутри инфраструктуры обмена сообщениями в соответствии с определенными бизнес-правилами.
На рис 9.5 показана совместная работа этих компонентов.
(рис 9.5) Компоненты и структура домена брокераРабочее место (Broker Workbench)
ИТ-специалист по интеграции использует инструментарий брокера на основе Eclipse
для создания и сохранения компонентов решения в локальном рабочем пространстве
или в системе контроля версий.
Инструментарий брокера состоит из нескольких дополнений (плагинов)
к WebSphere Studio. Эти плагины можно загрузить в уже инсталлированную копию
WebSphere Studio, или можно использовать рабочую систему WebSphere Studio,
поставляемую на компакт-диске WebSphere Business Integration Message Broker.
Менеджер конфигураций
Для размещения решений ИТ-специалист сохраняет готовые наборы сообщений
и потоки сообщений в хранилище менеджера конфигураций, которое представляет
собой базу данных DB2. Затем их можно разместить в одном или нескольких
брокерах. Брокеры, которые представляют собой компоненты рабочей системы, доступны
для различных платформ, в том числе:
для Windows;
нескольких версий UNIX $$\text{\textregistered}$$, включая Linux;
z/OS.
Набор брокеров, поставленных в соответствие данному менеджеру конфигураций
или связанных с ним, называется доменом брокеров. С рабочего места вы можете
конфигурировать связи в одном или нескольких доменах брокеров, например в
доменах тестирования, разработки и рабочем домене.
На рис 9.6 в разделе Domain Connections (Соединения доменов) есть только один
домен брокеров. В редакторе связей доменов показана информация для соединения
с WBRK_BROKER, которую мы сконфигурировали в разделе 7.2.5, "Инсталляция и конфигурирование
брокера сообщений". Связь домена брокеров представляет собой связь
клиента WebSphere MQ с менеджером очереди, который находится в подчинении у менеджера
конфигурации. Домен брокеров для нашего решения состоит из менеджера
конфигурации и только одного брокера с соответствующими им базами данных.
(рис 9.6) Инструментарий, связанный с доменом брокеровКогда администратор брокера с рабочего места размещает решение в брокере конкретного
домена, рабочее место взаимодействует с менеджером конфигураций, используя
соединение с данным доменом. Менеджер конфигураций отвечает за синхронизацию
конфигураций брокеров. Менеджер конфигураций будет отправлять новые артефакты
решения при помощи команды размещения брокеру, используя WebSphere MQ.
Брокер
Сам брокер состоит из нескольких компонентов (рис 9.7). Процесс брокера осуществляет
управление несколькими процессами и мониторинг их, каждый из которых
называется DataFlowEngine (система потока данных). Каждый процесс
DataFlowEngine соответствует административной группе выполнения (execution
group). Группа выполнения может обрабатывать одновременно несколько размещенных
потоков сообщений в соответствии с многонитевой моделью выполнения. В одном
брокере может работать несколько групп размещения, и ими можно управлять
по отдельности (т. е. размещать, запускать, останавливать, удалять и т. д.).
(рис 9.7) Структура брокераПотоки часто начинаются с узла MQInput, а это означает, что поток сообщений
начинается с чтения сообщения из очереди. Это сообщение затем передается дальше
по направлению графа с выполнением логики, которую моделирует поток. Еще один
часто применяемый тип входного узла – это узел HTTPInput. Этот узел используется
для получения потоковых данных (data streams) протокола HTTP. Мы используем
в нашей реализации оба типа входных узлов – и MQInput и HTTPInput.
Потоки сообщений в брокере могу использовать базы данных, а также выполнять
поиск и сохранение данных в потоках. Поддерживается несколько продуктов – баз
данных, в зависимости от конкретной платформы. С брокером часто используются
продукты DB2 и Oracle. В Windows также поддерживается SQL Server. Для нашей базы
данных мы использовали DB2.
Модель сообщений
На рис 9.8 показан общий обзор различных компонентов модели сообщений.
Каждый из них будет подробно описан ниже.
(рис 9.8) Общий обзор модели сообщенийВсе ресурсы, относящиеся к сообщениям, хранятся в файлах в хранилище в
рабочем пространстве, и это часть интеграции семейства Eclipse.
Наборы сообщений
Проект набора сообщений (message set project) – это контейнер для всех ресурсов,
относящихся к одному-единственному набору сообщений. Набор сообщений (message
set) – это логическая группа сообщений и объектов, их составляющих (элементов,
типов, групп). В содержимое набора сообщений входит:
файл с одним набором сообщений (messageSet.mset);
один или несколько файлов определений сообщений (.mxsd);
нуль и более файлов категорий сообщений (.category).
Единственный файл набора сообщений (.mset) содержит информацию, которая
является общей для всех сообщений набора. Эта информация редактируется при
помощи редактора наборов сообщений.
Каждый файл определений сообщений (.mxsd) содержит определения сообщений,
элементов, типов и групп. Для каждого набора сообщений требуется как минимум
один файл определений сообщений, описывающий сообщения, входящие в набор,
хотя для удобства управления можно распределить определения сообщений по
нескольким файлам. Файлы определений сообщений используют для описания логического
формата сообщений язык XML-схем. Физический формат сообщений сохраняется
с применением аннотаций XML-схем. Для создания и редактирования логической
структуры и физического формата сообщений можно использовать редактор
определений сообщений.
Сообщения могут группироваться в категории из соображений удобства и упрощения
генерации WSDL. Группы определяются в файлах .category.
Средства импорта сообщений
Файлы определений сообщений могут создаваться и заполняться с помощью одного
из имеющихся средств импорта. Средства импорта доступны для ХML DTD, XML-схем,
структур C и структур COBOL. Средства импорта можно применять либо с помощью
команды mqsicreatemsgdefs, либо с помощью инструментария Message Brokers
Toolkit.
Существует также утилита командной строки mqsimigratemsgsets для переноса
наборов сообщений WebSphere MQ Integrator V2.1 в наборы сообщений WebSphere
Business Integration Message Broker V5.
Редакторы сообщений
Файлы наборов сообщений, файлы определений сообщений и файлы категорий сообщений
имеют свои собственные редакторы, которые применяются для создания
и обслуживания этих ресурсов. Хотя с внутренней точки зрения эти файлы представляют
собой XML, для редактирования ресурсов всегда следует использовать поставляемый
редактор.
Средства экспорта сообщений
Существуют средства генерации, позволяющие экспортировать наборы сообщений
в стандартные внешние форматы. К этим форматам относятся:
словарь сообщений для размещения в брокере;
XML-схема для проверки передаваемых XML-сообщений;
описания Web-служб (WSDL) для клиентов Web-служб;
документация (в виде HTML).
Модель сообщений проверяется при каждом сохранении файла набора сообщений,
файла определения сообщений или файла категорий сообщений. Проверяется
целостность логической структуры модели и физических форматов.
9.3 Проектирование компонентов
При проектировании компонентов для proxyAssessorSystem следует принимать во
внимание несколько составляющих окончательной реализации:
Наборы сообщений, соответствующие интерфейсам решения.
Потоки сообщений и независимость от транспортного протокола.
Таблицы баз данных.
Распределение и агрегация.
В этом разделе описывается высокоуровневый дизайн и проблемы при
реализации этих четырех областей.
9.4 "Реализация наборов сообщений"
9.5, "Реализация таблиц баз данных"
9.6, "Создание потоков сообщений"
9.7, "Создание кода ESQL для потоков сообщений"
9.3.1 Наборы сообщений
Для каждого из 10 интерфейсов, перечисленных на рис. 9.1, существует SOAP-сообщение-запрос,
а иногда и сообщение-ответ. Нам нужно иметь возможность читать и посылать
сообщения, форматы и содержимое которых соответствуют этим 10 интерфейсам.
Выбор обработчика
В WebSphere Business Integration Message Broker доступ к содержимому сообщений
в протоколе SOAP предоставляет XML-обработчик или MRM-обработчик. XML-обработчик
достаточно эффективен, но не имеет возможности проверять сообщения
и не требует предоставления определения сообщения. Это может рассматриваться
и как преимущество и как недостаток. Обработчик интерпретирует SOAP-сообщение
в работающей системе, используя XML-теги в этом сообщении. MRM-обработчик, напротив,
может проверять сообщения по их определениям, требует предоставления
определения, а в ходе создания потока сообщений может помочь в анализе содержимого
сообщений при выполнении SQL-инструкций, которые запрашивают и записывают
сообщения.
На практике, если форматы сообщений известны заранее, лучше всего использовать
для разработки и тестирования потоков сообщений MRM. В готовой системе переход
на XML-обработчик может дать выигрыш в производительности.
Создание определений сообщений для SOAP-интерфейсов
WebSphere Business Integration Message Broker импортирует файлы схем, но он не
имеет средств импорта WSDL. Чтобы создать определения сообщений по WSDL-файлам,
нам нужно извлечь определения схем из высокоуровневых элементов сообщений,
содержащихся в WSDL-файле, предоставленном архитектором решения, и импортировать
эти определения в набор сообщений WebSphere Business Integration
Message Broker. Каждому интерфейсу (и запрос и запрос/ответ рассматриваются как
один интерфейс) соответствует свое определение в одном и том же наборе сообщений.
Далее, импортируя схему, созданную по определению SOAP 1.1 WSDL, и объединяя
эту SOAP-схему со схемой каждого интерфейса, мы создаем определения сообщений
для каждого интерфейса.
Все необходимые файлы схем мы уже создали из соответствующих WSDL-файлов
и сохранили в директории дополнительных материалов .\SG24-6636\Broker\Schemas.
Процедура преобразования WSDL в схему описывается в следующих разделах.
Главная проблема, с которой мы встретились и с которой в какой-то момент сталкиваются
все проекты, состоит в наличии нескольких копий одних и тех же определений,
для которых существует возможность десинхронизации. Необходимо сформировать
процедуру, операционную или техническую, обеспечивающую синхронизацию определений.
Один подход – это поместить все определения в файлы схем и использовать инструкции
импорта в WSDL-файлах. Мы избрали подход, при котором WSDL является главным
источником, а системный архитектор отвечает за все определения интерфейсов.
Реализация всех определений интерфейсов описывается в разделе 9.4, "Реализация
наборов сообщений".
9.3.2 Потоки сообщений и независимость от транспортного протокола
На схеме последовательностей (рис 9.3) показаны все взаимодействия системы
proxyAssessorSystem. В качестве примера на рис 9.9 более подробно показаны потоки
3, 3a, 4 и 4a.
(рис 9.9) Потоки 3, 3a, 4 и 4aКаким образом следует устанавливать соответствия между интерфейсами, показанными
на рис. 9.9, и потоками сообщений в брокере?
Будет как минимум один поток для каждой службы, предлагаемой брокером (в таблица 9.1.
Существует пять потоков, которые вызывают выходные интерфейсы. Они называются клиентскими потоками (Client Flows), поскольку они являются клиентами Web-служб, предоставляемых другими серверами.
Для поддержки тех взаимодействий, которые в LGI переводятся с SOAP/Http на SOAP/JMS, входные и выходные узлы LGI разделены и упакованы в специальный, специфический для транспортного протокола, проект набора сообщений.
Существуют потоки Fault (Ошибка) и Reply (Ответ), которые являются общими для всех сервисных потоков в решении, и они реализованы в виде специфичных для транспортного протокола потоков. Они возвращают ответы или ошибки клиентам служб, реализуемых брокером.
Клиентские потоки должны перехватывать любые ошибки, возникающие в потоках, или возвращаемые службами, которые они вызывают.
Эти ошибки не возвращаются в сервисный поток, который вызывал клиентский
поток, поскольку возможность использовать обработчик ошибок сервисного потока
уже упущена. Сервисный поток уже вернул ответ-подтверждение своему клиенту,
и клиент больше не ждет ответа.
Обработчик ошибок в клиентских потоках реализован в виде узла TryCatch, соединенного
с входным узлом подпотока. Ошибки передаются в отдельный обработчик
ошибок, который мы назвали потоком клиентской ошибки (ClientError).
В данном проекте все взаимодействия с оценщиками ограничиваются протоколом SOAP/http и обрабатываются как часть главного потока.
Одним из способов разработки выходных потоков к оценщикам с поддержкой
дополнительных транспортных протоколов является использование узла RouteToLabel
(Передача на метку) с вызовом разных выходных потоков для каждого протокола
на основе метки, выбранной в потоке. Для входных потоков от оценщиков мы снова
используем концепцию отделения входного потока от входного интерфейсного потока
с созданием для каждого типа транспорта своего входного потока.
Помимо этих типов потоков, для входящих подтверждений, относящихся к запросам,
посланным через MQ или JMS-систему, есть отдельные потоки Ack, поскольку
не существует комбинированного узла "запрос/ответ". Ответ должен передаваться
в отдельном потоке. Нам не нужны эти дополнительные потоки при использовании
SOAP/Http, поскольку для SOAP/Http существует синхронный узел
HttpRequest. Следовательно, Ack-потоков для SOAP/Http не существует, и нам не
нужно создавать такие потоки для нашего решения.
Различные типы потоков и их взаимоотношения показаны на рис 9.10.
(рис 9.10) Разделение общих потоков и потоков, специфичных для транспортного протоколаПреимущества упаковки транспортно-специфических потоков LGI (верхний ряд
синих прямоугольников) отдельно от общих потоков и потоков оценщика (оранжевый
нижний ряд прямоугольников) состоит в том, что при переводе шины LGI с SOAP/Http
на SOAP/JMS необходимо изменить только потоки, обозначенные синим цветом.
С помощью небольшого художественного надругательства над исходными UML-схемами
последовательностей (рис 9.11) мы показали соответствия потоков
AssessorAvailability части схемы последовательности из Rational Software Architect
с целью графически продемонстрировать корреляцию между потоками, которые мы
разработали для брокера, и взаимодействиями, указанными в архитектуре решения.
(рис 9.11) Потоки в AssessorAvailabilityНа рис 9.12 показано эквивалентное представление потоков Assessor Report.
(рис 9.12) Потоки в Assessor Report
Краткие описания потоков
В табл. 9.2 показаны общие потоки,
а в табл. 9.3 – потоки, независимые от транспортных
протоколов, некоторые из которых также взаимодействуют с оценщиками,
а в табл. 9.4 показаны потоки, взаимодействующие с LGI.
Общие потоки
| Поток |
Вызывает |
Описание |
| ClientError (Клиентская ошибка) |
|
Перехватывает ошибки из клиентских потоков |
| Fault (Ошибка) |
|
Предотвращает зацикливание сообщений, генерирует и выводит ошибку SOAP, выводит сообщение об ошибке |
| Reply (Ответ) |
|
Посылает сообщение-ответ в нужном формате |
Потоки, независимые от транспорта, и потоки к оценщикам и от них
| Потоки |
Что вызывает |
Описание |
| Потоки Assessor Availability |
| Поток3 |
Поток4 |
Получение запроса списка доступных оценщиков |
| Поток3a |
Выход3a |
Агрегирование и возврат списка доступных оценщиков |
| Поток4 |
EAEA – External Accessor (Внешний оценщик) |
Распределяет запрос о готовности среди оценщиков |
| Поток4а |
Поток3a |
Получает ответы с данными о готовности от оценщиков |
| Потоки Assessor Report |
| Поток6 |
Поток7 |
Получение запроса отчета об оценке |
| Поток6a |
Выход6a |
Возврат подтверждения от оценщика |
| Поток7 |
EA |
Запрос оценки у оценщика |
| Поток7a |
Поток6a |
Получение согласия от оценщика |
| Поток8 |
Поток9 |
Получение отчета об оценке от оценщика |
| Поток9 |
Выход9 |
Отправка отчета об оценке, полученного от оценщика |
Потоки, специфичные для транспортного протокола, направленные в LGI и от нее
| Потоки |
Что вызывает |
Описание |
| Потоки Assessor Availability |
| Поток3 |
Поток3 |
Получение запроса списка доступных оценщиков |
| Выход3a |
AASAAS – Assessor Automation System (Cистема автоматизации работы с оценщиком) |
Агрегирование и возврат списка доступных оценщиков |
| Поток3aAck |
|
Обработка подтверждения приема списка оценщиков |
| Потоки Assessor Report |
| Поток6 |
Поток6 |
Получение запроса отчета об оценке |
| Выход6a |
AAS |
Возврат согласия от оценщика |
| Поток6aAck |
|
Обработка подтверждения приема согласия |
| Поток9 |
EA |
Отправка отчета об оценке, полученного от оценщика |
| Поток9Ack |
|
Обработка подтверждения приема отчета |
9.3.3 Таблицы баз данных
Для системы proxyAssessorAutomation требуется три таблицы базы данных для управления
корреляцией данных, проходящих между службами.
CLAIMASSESSOR
Таблица CLAIMASSESSOR используется для хранения сведений о запросах готовности,
направляемых оценщикам (поток4), и в нее заносится информация об ответах оценщика на эти запросы.
Таблица CLAIMASSESSOR
| Имя столбца и ключ |
Тип |
Что обновляет данные |
| claimID (index ca1) |
Integer |
Поток4 |
| assessorID (index ca1) |
Integer |
Поток4 |
| assessorURL |
Long Varchar |
Поток4 |
| location |
Char(100) |
Поток4 |
| reqdate |
Date |
Поток4 |
| makeOfCar |
Char(15) |
Поток4 |
| registration |
Char(7) |
Поток4 |
| predDate |
Date |
Поток3a |
| predCost |
Integer |
Поток3a |
| replytoq |
Char(48) |
Поток4 |
| replytoqmgr |
Char(48) |
Поток4 |
| correlid |
Blob(24) |
Поток4 |
| requestcompletetime |
Timestamp |
Поток3a |
ACTIONASSESSOR
Таблица ACTIONASSESSOR используется для хранения информации о запросах
подтверждения, направляемых оценщикам (поток7), и в нее заносится информация от
ответах оценщика на эти запросы.
Таблица ACTIONASSESSOR
| Имя столбца и ключ |
Тип |
Что обновляет данные |
| claimID (index aa1) |
Integer |
Поток7 |
| assessorID (index aa1) |
Integer |
Поток7 |
| assessorURL , |
Long Varchar |
Поток7 |
| location |
Char(100) |
Поток7 |
| reqDate |
Date |
Поток7 |
| makeOfCar |
Char(15) |
Поток7 |
| registration |
Char(7) |
Поток7 |
| ackfromassessor, |
Char(10) |
Поток7ack |
| confirmedDate |
Date |
Поток6a |
| accepted |
Char(5) |
Поток6a |
| replytoq |
Char(48) |
Поток7 |
| replytoqmgr |
Char(48) |
Поток7 |
| requestcompletetime |
Timestamp |
Поток6a |
| rejected |
Char(20) |
Поток8 |
| rejectedDate |
Date |
Поток8 |
RESOLVEASSESSOR
Таблица RESOLVEASSESSOR используется, если существует несколько типов оценщиков
с разными форматами сообщения, и нам нужно определить, оценщику какого
типа посылается конкретное сообщение. Данная таблица связывает тип с каждым
идентификатором оценщика, а также предоставляет технические данные, например
HTTP-адрес. В данной реализации доступ ко всем оценщикам осуществляется по
протоколу SOAP/http, и мы эту таблицу не используем.
| Имя столбца и ключ |
Тип |
| assessorID (index ra1) |
Integer |
| assessorType |
Char(10) |
| assessorhttpaddress |
Long Varchar |
| lgibrokerhttpaddress |
Long Varchar |
9.3.4 Распределение и агрегация
Важной возможностью, которую предоставляет брокер, является распределение и агрегация
сообщений. В системе proxyAssessorSystem данная возможность используется
для отправки подходящим внешним оценщикам запросов на выдвижение предложений
по проведению оценки претензии, а затем для объединения получаемых ответов.
Процесс ExternalClaimAssessor посылает список подходящих оценщиков в систему
proxyAssessorSystem. Система proxyAssessorSystem разделяет список на отдельные запросы
(которые в полной реализации будут отправляться с использованием разных
транспортных протоколов) и отправляет их через SOAP/Http, получая подтверждения
от каждого оценщика, получившего запрос. В течение какого-то времени, которое
определяется контрактом между LGI и оценщиками и которое может зависеть от
вида страховки клиента, все оценщики могут присылать предложения. Предложения
объединяются (агрегируются) системой proxyAssessorSystem и посылаются процессу
ExternalClaimAssessor в виде единого списка.
Узлы агрегации
Брокер предлагает три узла для реализации агрегации:
Узел Aggregate Control.
Узел Aggregate Request.
Узел Aggregate Reply.
Узлы Aggregate Control и Aggregate Request используются в потоке распределения,
а узел Aggregate Reply – в потоке агрегации для сбора ответов. Узлы агрегации формируют
основу для реализации распределения и агрегации. ИТ-специалист по брокеру
должен связать поток сообщений с этими узлами и обработать создание разветвляющихся
сообщений и сборного сообщения. Прежде чем обращаться к проектированию
системы proxyAssessorSystem, следует принять во внимание несколько вопросов,
связанных с проектированием.
Один поток или два?
Потоки распределения и агрегации могут представлять собой один и тот же физический
поток. Время жизни всего процесса распределения/агрегации – это время
жизни этого потока. В качестве альтернативы процесс можно реализовать в виде двух
потоков, с управляющим сообщением, передаваемым из потока распределения в поток
агрегации для координации между собой двух частей процесса. Реализовать один
поток проще, но два потока более гибки в плане реализации транзакционных функций
и предоставляют больше возможностей для управления в период выполнения,
например запуск в разных группах выполнения.
Транспортные протоколы
Готовая система агрегации поддерживает любой транспортный протокол,
используемый для получения и возврата списка оценщиков в процесс ExternalClaimAssessors.
Промежуточные потоки, направляемые к оценщикам и от них должны работать с использованием
одного из встроенных транспортных протоколов, поддерживающих
протокол типа запрос/ответ:
WebSphere MQ Enterprise Transport (узлы MQInput и MQOutput);
WebSphere MQ Mobile Transport (узлы MQeInput и MQeOutput).
Брокер не поддерживает встроенные протоколы, которые не соответствуют
модели запрос/ответ или пользовательские транспортные протоколы:
WebSphere MQ Web services Transport (узлы HTTPInput, HTTPReply и HTTPRequest);
WebSphere MQ Real-time Transport (узлы Real-timeInput и Real-timeOptimizedFlow);
WebSphere MQ Telemetry Transport (узлы SCADAInput и SCADAOutput).
Нам нужно, чтобы служба агрегации поддерживала любой тип транспортного
протокола, поскольку мы разрешаем оценщикам связываться с LGI, используя разные
протоколы. Решением является преобразование в брокере потоков, связанных с
определением готовности оценщиков, для использования WebSphere MQ и преобразование
запросов, направляемых к оценщикам и от них, между протоколами WebSphere
MQ и HTTP/SOAP. В документах центра информации версии 5 описываются интерфейсы
узлов агрегации, позволяющие создавать агрегационные потоки, не относящиеся
к WebSphere MQ. Реализация такого интерфейса имеется в WebSphere Business
Integration Message Broker Version 6.0, и в нее входит поддержка агрегации для протокола
SOAP/http, что устраняет необходимость использовать промежуточные потоки
WebSphere MQ.
Надежность и тайм-ауты
Важная часть проектирования агрегации – это вопрос времени. Исходя из наших условий,
мы имеем дело с растянутым во времени процессом, и должны учитывать,
сколько времени должно длиться ожидание ответа, что делать с опоздавшими ответами
и, поскольку мы оперируем при сборе ответов сроками, составляющими часы
и дни, последствиями нарушения процесса агрегации.
Тайм-ауты
Истечение времени ожидания (тайм-аут) следует рассматривать как часть требований,
предъявляемых к процессу, и его должны задавать бизнес-аналитик и архитектор.
В нашем случае значения тайм-аута включаются в контракты с клиентами
и оценщиками. Нужно установить два вида тайм-аутов. На рис 9.13 зелеными кружками
обозначены узлы, для которых нужно установить тайм-ауты.
(рис 9.13) Полное представление распределения и агрегации сообщенийПервый тайм-аут относится к узлу Aggregate Control. Он управляет общей продолжительностью
процесса агрегации: сколько времени процесс будет ждать ответа от оценщиков.
Значение, указанное в контракте между LGI и оценщиками, должно удовлетворять
времени ответа, которое ожидает от LGI клиент, которому был продан страховой
полис. Как только срок тайм-аута превышен, узел Aggregation Reply начинает направлять
ответы на другой выходной терминал – для обработки опоздавших ответов.
В случае процесса обработки претензии существует два класса клиентов с разными
ожидаемыми временами ответов, для которых, следовательно, необходимо определить
два разных параметра тайм-аута. Поскольку значение тайм-аута жестко прописано
в свойстве узла Aggregate Control, для двух разных типов клиентских контрактов
нужно создать два узла Aggregate Control. В нашей реализации, для упрощения,
поддерживается только один полис с прописанным временем ответа.
Второе значение таймаута, которое устанавливается для узла Aggregation Reply, выбрать
сложно, но оно не является очень критических. В нем указывается, как долго узел
Aggregation Reply будет ждать получения сообщения, прежде чем будет принято решение
о невозможности связать его с управляющим сообщением, посланным из узла Aggregation
Control. После истечения срока тайм-аута узел Aggregation Reply отправляет сообщение
на свой терминал Unknown. Это глобальное свойство узла Aggregation Reply.
В качестве иллюстрации представьте себе такую ситуацию: вы планируете сесть
на поезд, идущий в Лондон на безлюдной станции. Вы знаете, что поезда на Лондон
ходят довольно точно по расписанию, и вы хотите сесть на поезд в 10:00. Если вы
попадете на станцию в 10:01 и поезда на станции не окажется, будет ли это означать,
что вы пропустили поезд или что поезд опаздывает? Сколько вы будете ожидать на
станции, прежде чем решите, что вы пропустили поезд? В данном примере поезд –
это управляющее сообщение время, которое он проводит у платформы, – общая
продолжительность агрегации, а пассажиры, желающие попасть на поезд, – это агрегируемые
ответы. Второе значение тайм-аута – это время ожидания, прежде чем будет
принято решение о том, что поезд ушел или вообще не придет.
Выбор значения для второго тайм-аута определяет, когда сообщения-ответы начинают
передаваться на терминал Unknown, обозначая возникновение каких-то неполадок.
В нашем сценарии приемлемым вариантом будет установление для второго
тайм-аута значения, равного общей продолжительности агрегации.
Прерывания
Узел Aggregation Reply сохраняет свое состояние в базе данных брокера, так что короткие
прерывания в потоке сообщений не вызовут чрезмерных проблем. При возобновлении
потока узел Aggregation Reply будет продолжать работать, если не истек
срок тайм-аута. В случае более длительных прерываний потока, если поток снова начинает
работать уже после истечения срока тайм-аута, сообщения, поступающие
после останова потока, будут рассматриваться как опоздавшие ответы.
Проектирование потоков распределения и агрегации
В центре информации брокера существует обширная документация с техническими
сведениями об агрегации и о том, как следует создавать решения. На рис 9.13 вся эта
информация сведена в единую схему, которую мы будем использовать для связывания
разных частей реализации, распределенных по множеству потоков, esql-файлов и узлов
обработки сообщений. Для описания дизайна мы изучим потоки, один узел
за другим, используя рис 9.13.
Поток 4
Запрос о готовности, полученный от процесса ExternalClaimAssessor, был принят
и проверен. Поток 4 вызывается из потока 3.
Подготовка
1. Сообщение HTTP/SOAP принимается из входного серверного потока (Input) после проверки.
2. Узел TryCatch определяет контекст ошибки для оставшейся части обработки, выступая в роли SOAP-клиента при запрашивании информации о готовности у всех оценщиков.
3. Узел удаления из базы, Delete Claim Status, используется для очистки информации о состоянии предыдущей претензии перед обработкой нового запроса.
4. Узел Prepare MQ удаляет все следы HTTP-запроса из папок брокераМы обнаружили, что некоторые функции брокера могут быть введены в заблуждение, если в брокере одновременно присутствуют папки MQ и http. Поэтому важно при переключении транспортных протоколов очищать старые ненужные папки. и задает папку MQ для создания нового MQ-сообщения.
Aggregate Control
5. Узел Aggregate Control (AC) запускает процесс распределения/агрегации:
Как уже говорилось ранее, в узле АС указывается тайм-аут ответов.
Также агрегату присваивается имя, чтобы отличить его среди других агрегатов, которые могут формироваться. Например, мы реализовали разные агрегаты с разными временами ответа.
Узел АС помещает информацию в папку LocalEnvironment, которая должна быть связана с узлом Aggregate Request и узлом MQ Output, которые будут посылать управляющее сообщение на узел Aggregate Reply.
Узел PrepareMQControl создает управляющее сообщение, которое посылается по MQ к Flow4.(MQMD). В примере 9.1 показано, как можно создать новый MQMD.
CREATE NEXTSIBLING OF OutputRoot.Properties DOMAIN 'MQMD';
SET OutputRoot.MQMD.StrucId = MQMD_STRUC_ID;
SET OutputRoot.MQMD.Version = MQMD_CURRENT_VERSION
Fan-Out
6. Узел Fan-Out распространяет отдельные сообщения-запросы последовательно по
оставшейся части потока, перебирая элементы списка подходящих оценщиков
в запросе. Каждое сообщение-запрос направляется новому оценщику, в новую
точку назначения. В примере 9.2 показано, как можно задать URL оценщика.
OutputLocalEnvironment.Destination.HTTP.RequestURL =
InputRoot.MRM.soap11:Body.fl3:requestAssessorAvailability.fl3:assessorL
ist.fl3:assessors[assessorCount].fl3:assessorURL;
В параметрах вычислительного узла Fan Out должно быть указано распространение
папки LocalEnvironment, а также обычный параметр распространения дерева сообщений.
Также должна быть строчка кода (пример 9.3), копирующая папку
LocalEnvironment, которая была получена от узла Aggregate Control.
-- Для узла агрегации необходима следующая инструкция
SET OutputLocalEnvironment = InputLocalEnvironment;
MQOut Assessor
7. Узел MQOut Assessor, по сути, посылает сообщение WebSphere MQ в очередь оценщика.
Сообщение никуда не посылается, но в папке LocalEnvironment создается
папка Written Destination, которая используется узлом Aggregate Request для задания
корреляционной информации для агрегации.
Мы извлекли сгенерированный идентификатор сообщения (MsgID) из папки Written
Destination, чтобы убедиться в том, что он идентичен тому, который был сохранен
узлом Aggregation Request. У нас были определенные проблемы при сохранении нашего
собственного MsgID в MQMD и при включении опции узла MQOut, запрещающей
генерацию нового MsgID. Казалось, что он не совпадает с тем, который указан
в таблице узла Aggregation Request. Чтобы быть уверенными в том, что скрытый
MsgId, сохраненный узлом Aggregation Request, идентичен тому, который мы сохранили
в таблице CLAIMSASSESSOR, мы сохранили MsgID из папки Written Destination.
Таким образом, мы можем быть абсолютно уверены в том, что мы сохраняем тот же
MsgID, что и в узле Aggregation Request. Мы так и не смогли выяснить, почему ошибки
были связаны с MsgID, но формирование потока с использованием папки Written
Destination устранило возможность возникновения проблемы.
AggregateRequest
8. Все, что мы предоставили для узла Aggregate Request – это имя папки, которая долж-
на быть создана для хранения объединенного сообщения-ответа (пример 9.4).
InputRoot.comIbmAggregateReply.<имя папки>
Все наши сообщения-запросы используют папку с этим именем, поэтому индивидуальные
сообщения-ответы помечаются данным именем папки в агрегированном
сообщении-ответе.
Save AssessorRequest
9. Узел Save AssessorRequest сохраняет MsgId (= ReplyIdentifier) в папке WrittenDestination,
в базе данных ClaimsAssessor, в форме поля CorrelId, с указанием для него
значений ClaimID и AssessorID. Это значение для каждого ответа восстанавливается
в поле MQMD.CorrelId, когда ответ попадает в поток 3а (пример 9.5).
INSERT INTO Database.EMERGE.CLAIMASSESSOR (
claimID, assessorID, assessorURL,location, reqdate, makeofcar,
registration,replytoq, replytoqmgr, correlid) VALUES (
InputRoot.MRM.soap11:Body.fl7:requestAssessorAvailability.fl7:
claimID,
InputRoot.MRM.soap11:Body.fl7:requestAssessorAvailability.fl7:
assessorID,
InputLocalEnvironment.Destination.HTTP.RequestURL,
InputRoot.MRM.soap11:Body.fl7:requestAssessorAvailability.fl7:location,
InputRoot.MRM.soap11:Body.fl7:requestAssessorAvailability.fl7:reqDate,
InputRoot.MRM.soap11:Body.fl7:requestAssessorAvailability.fl7:cardet.
fl7:makeOfCar,
InputRoot.MRM.soap11:Body.fl7:requestAssessorAvailability.fl7:cardet.
fl7:registration,
'NoReplytoQ',
'NoReplytoQmgr',
InputLocalEnvironment.WrittenDestination.MQ.DestinationData.msgId);
SOAP/HTTP Assessor
10. И наконец, каждое сообщение-запрос посылается оценщику. Если бы мы поддерживали
несколько типов соединений, мы бы использовали узел RouteToLabel для
выбора выходного узла.
Поток 3а
Поток 3а получает управление от потока 4а, который реализует для оценщиков службу
возврата данных о готовности.
Подготовка
1. Узел TryCatch определяет контекст обработки исключений для
оставшейся части процесса, который является клиентом процесса
ExternalClaimsAssessor.
2. Узел Update CLAIMASSESSOR обновляет базу данных, записывая в нее
информацию, полученную от каждого оценщика, исключительно для целей
аудита. Сохраненная информация нигде в нашем сценарии не
используется.
3. Узел Prepare Reply очищает всю информацию HTTP/SOAP из папок
брокера и фактически создает сообщение-запрос, включив в нее всю
информацию ответа оценщика для передачи ее в узел MQReply. Делается
это для того, чтобы казалось, будто бы все время велась обработка
сообщения MQ Request, без передачи его через HTTP.
4. Узел MQReply AggIn помещает ответ в очередь AggIn reply и
использует значение опции MQMD для копирования MsgID (который сейчас
представляет собой исходное значение ReplyIdentifier) в поле
CorrelId.
Возможно, сработал бы вариант без создания реального сообщения-ответа
WebSphere MQ, с простой передачей правильно сформированных папок в узел
AggregateReply. У нас возникали некоторые проблемы при попытках обеспечить правильную
работу агрегации, поэтому мы не пытались проводить данную оптимизацию.
MQInput AggIn
5. Узел MQInput AggIn получает сообщение-ответ из очереди AggIn и передает его
узлу AggregateReply.
MQInput Control
6. Узел MQInput Control получает управляющее сообщение на FLOW3A.CONTROLQ
и передает его в узел AggregateReply.
Aggregate Reply
7. Узел Aggregate Reply формирует объединенное сообщение-ответ в папке, указанной
узлом Aggregate Request. Как уже обсуждалось ранее, работает два таймера.
Таймер Unknown направляет опоздавшие ответы на терминал нераспознанных
сообщений. Таймер Timeout отправляет неготовое объединенное сообщение на
терминал Timeout. На схеме оба таймера направляют сообщения к узлам трассировки.
На практике нам нужно создать сообщение-запрос, идущее к процессу
ExternalClaimAssessors либо от выходного терминала, либо от терминала Timeout.
Generate Output3a
Узел Generate Output3a конструирует сообщение-запрос, используя папку
объединенного запроса, созданную узлом AggregateReply.
9.4 Реализация наборов сообщений
Для создания наборов сообщений, содержащих определения сообщений для всех
интерфейсов, перечисленных в табл. 9.1, нам нужно выполнить шесть шагов:
Преобразовать WSDL-определения сообщений в схемы.
Создать проект набора сообщений.
Создать набор сообщений.
Импортировать схему интерфейсов.
Преобразовать схемы в определения сообщений.
Настроить определения сообщений для создания SOAP-конвертов
9.4.1 Преобразование сообщений из wsdl-файлов в схемы
WebSphere Studio Application Development Integration Edition или Rational Software
Architect – это самые лучшие инструменты для преобразования WSDL-файлов в схемы,
поскольку оба эти инструмента имеют специализированный WSDL-редактор
и редактор схем. WebSphere Business Integration Message Broker содержит только
редактор схем.
В WebSphere Studio Application Development Integration Edition создайте новые файлы
схем для каждого WSDL-файла, который нужно преобразовать.Создавайте файлы схем с теми же именами, но с расширениями .xsd. Существует
мастер, который поможет вам это сделать. Выберите пункт меню File (Файл) $$\to$$ XML $$\to$$ XML Schema. Присвойте схеме имя и нажмите Finish (Готово)
(рис 9.14).
(рис 9.14) Создание нового файла схемы в Integration EditionСохраните файлы в директории с именем wsdl. На рис 9.15 показано дерево
проектов в WebSphere Studio Application Development Integration Edition
с несколькими файлами WSDL и .xsd.
(рис 9.15) Некоторые из файлов схем и WSDL в проекте
Существует два типа WSDL-файлов. Часть имеет встроенные полные определения
сообщений, а часть ссылается на схему Businessitems.xsd. Проще всего начать
с файлов с полными определениями сообщений. После их конвертирования становится
понятно, как следует редактировать оставшиеся файлы:Возьмем в качестве примера файл AssessorAvailability(3).wsdl и скопируем все,
что находится между тегами <wsdl:types> и <\wsdl:types>. Откройте файл
AssessorAvailability(3).xsd, выделите все начиная с <schema ... и по <\schema>
(пример 9.6) и замените эти данные скопированными определениями.<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.ibm.com"
xmlns:test="http://www.ibm.com">
</schema>
Файл должен сохраниться без ошибок. В качестве дополнительного задания,
приведите в порядок выражение schema и оставшуюся часть файла (первая
часть файла схемы показана в примере 9.7):<?xml version="1.0" encoding="UTF-8"?>
<schema elementFormDefault="qualified"
targetNamespace="http://broker.lgi.itso.assessavail"
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:intf="http://broker.lgi.itso.assessavail" >
<element name="requestAssessorAvailability">
<complexType>
<sequence>
<element name="claimID" nillable="true" type="int" />
<element name="location" nillable="true" type="string" />
<element name="responseTime" nillable="true" type="string" />
<element name="requiredDate" nillable="true" type="string" />
<element name="makeOfCar" nillable="true" type="string" />
<element name="assessorList" nillable="true"
type="intf:AssessorList" />
</sequence>
</complexType>
</element>
... продолжение ...
были удалены дублирующиеся пространства имен;
поскольку http://www.w3.org/2001/XMLSchema является пространством имен по умолчанию, все префиксы xsd: можно удалить;
убедитесь, что целевое пространство имен уникально в пределах набора сообщений и совпадает с пространством имен, ассоциированным с префиксом, применяемым для всех встроенных сложных типов.
Внимание! Мы предлагаем, чтобы при импортировании схемы в MRM брокера в каждом
создаваемом вами файле схемы был свой префикс целевого пространства имен. Мы
использовали префиксы flxx, где хх – номер потока. Изменение префикса не влияет на
семантику схемы, но позволяет повысить удобство чтения и избежать путаницы.
Лучший способ избежать проблем с именами – это управлять пространствами имен и
определениями типов на всем протяжении интеграционного пространства, но такое во многих
случаях просто невозможно по организационным и историческим причинам. В данном проекте
у нас есть несколько конфликтов имен, отражающих проблемы реального мира, и мы решаем
задачу по устранению этих конфликтов.С точки зрения программной инженерии важная цель – получить только один именованный тип
для каждого типа данных, т. е. избежать дублирования определений, которые являются
источниками ошибок, если определения отличаются друг от друга. Если этой цели нельзя
достигнуть без проблем, то можно использовать другую, не столь сильную, но более
достижимую цель – помещать все дублирующиеся типы в разные пространства имен.
Обеспечьте наличие для разных разработчиков и групп разработчиков корневого пространства
имен, в котором определяются уникальные имена пространств имен и осуществляется
управление их типами.
Экспортируйте файлы схем в виде zip-файла или в форме файловой системы, готовой к импортированию в брокер.
9.4.2 Создание проекта набора сообщений
Каждый проект набора сообщений может содержать только один набор сообщений.
В каждом наборе сообщений хранится несколько определений сообщений. Каждому
определению сообщения соответствует один файл схемы. Одна и та же схема может
использоваться в разных определениях сообщений, и в один файл схемы можно собирать
множество элементов.
Сколько же проектов наборов сообщений нам нужно создать для хранения всех
нужных нам наборов сообщений? Мы можем поместить все определения в один набор
и можем помещать каждое определение в свой собственный набор сообщений.
Как правило, лучше всего, если все определения сообщений находятся в одном
наборе сообщений. Так ими будет проще управлять, а при наличии большого числа
определений набор сообщений будет проще создать. С точки зрения программной
инженерии это позволяет многократно использовать сложные типы, что уменьшает
вероятность ошибки. Однако наряду с этими преимуществами возникает необходимость
в организованном создании типов и сообщений. Дублирование типов и сообщений
в одном наборе будет приводить к ошибкам, даже если эти типы и сообщения
находятся в разных пространствах имен.
(рис 9.16) Организация наборов сообщения в брокереС точки зрения управления проектом добиться такой организованности может
быть весьма сложно, в особенности в проектах интеграции приложений, где вы не
имеете контроля над именами частей системы. Поэтому брокер предоставляет нам
возможность применять несколько наборов сообщений и проектов без совместного
использования одних элементов в разных наборах.
Части, относящиеся к разным наборам, могут вместе применяться в одном потоке,
но ответственность за правильный подбор и использование частей лежит на разработчиках
потоков сообщений.
В случае с проектом ExternalClaimAssessors эти части не проектировались как
единое целое, и поэтому существуют дублирующиеся сложные типы и имена сообщений.
Кроме того, используемая нами практика, когда все WSDL-файлы являются
независимыми, означает, что мы должны импортировать в брокер дубликаты типов.
Поэтому мы не можем просто создать все определения сообщений в одном наборе
сообщений. Нам нужно было принимать решение. Мы могли вернуться назад и изменить
определения, рационализировав имена и сделав более общими типы, или же мы
могли создать несколько разных потоков сообщений.
Как правило, возвращаться назад и менять определения сообщений в WSDL-файлах
довольно сложно. Существует множество зависимостей, которые следует учитывать,
включая полную переработку связей с партнерами, исправление WSDL-определений
для средств трансформации и (если используются такие программы, как EJB)
повторную генерацию EJB по новым WSDL-определениям с копированием пользовательского
кода из старого EJB в новый EJB. Кроме того, следует учитывать вероятность
внесения ошибок при выполнении этих задач.
На практике в ходе интеграции корпоративных приложений лучше всего свести
к минимуму переработку имеющегося кода, а для связывания частей использовать
возможности интеграционных серверов, таких, как WebSphere Business Integration
Message Broker.
Мы исходно намеревались определить несколько наборов сообщений, что позволило
бы избежать конфликтов имен и типов при импортировании схем в брокер.
В табл. 9.8 показано, как мы распределили определения сообщений.
Наборы сообщений и определения
| .xsd |
Проект набора сообщений |
Набор сообщений |
| AssessorAvailability(3) AssessorAvailability(3a) |
AssessorAvailability 3 и 3a |
3 и 3a |
| AssessorAvailability(4) AssessorAvailability(4a) |
AssessorAvailability 4 и 4a |
4 и 4a |
| AllocateAssessment(6) AllocateAssessment(6a) |
AllocateAssessment 6 и 6a |
6 и 6a |
| AssessorReport(7) AssessorReport(7a) |
AssessorReport 7 и 7a |
7 и 7a |
| AssessorReport(8) AssessorReport(9) |
AssessorReport 8 и 9 |
8 и 9 |
Все шло прекрасно, пока мы не начали писать код ESQL. Мы обнаружили, что, хотя
компилятор ESQL нормально воспринимал использование нескольких наборов сообщений,
в функции автоматического выполнения имелась проблема, в основном
объясняющаяся тем, что на все наши типы ссылалось одно сообщение SOAP-конверт.
Функция автоматического выполнения могла предлагать специализированные элементы
Body из одного набора сообщений. Вообще-то мы могли бы продолжать и без
правильно работающей функции автоматического выполнения, используя несколько
наборов сообщений для разрешения конфликтов имен и типов. Мы приняли решение
учесть все это, разрешить конфликты имен и использовать один набор сообщений.
Мы ожидаем, что версия 6 WebSphere Business Integration Message Broker будет
содержать усовершенствования, улучшающие его работу в данной области, что сделало
бы подход с несколькими наборами сообщений более предпочтительным.
Теперь наша цель – разрешить конфликты имен, возникающие из-за использования
одного набора сообщений в WebSphere Business Integration Message Broker без
изменения WSDL-определений Web-служб.
Совет. По умолчанию брокер сохраняет свое рабочее пространство в инсталляционной
директории. Чтобы работать с несколькими рабочими пространствами и хранить их в папке
My Documents, чтобы они архивировались программами, которые исключают папки ...\Program
Files\... , измените ярлык вызова рабочего места, указав параметр –data:"C:\Program Files\IBM\WebSphere Business Integration Message Brokers\eclipse\mqsistudio.exe" -
data "C:\Documents and Settings\Administrator\My Documents\ITSO\SA-H414\In work\Code\Final
tested files\wbimb\workspace"
Осторожно! Создается длинный путь к файлу. Позже вы увидите, что это приводит к тому, что
в рабочем месте начинают возникать труднопредсказуемые ошибки. Позже в этой лекции вы
найдете еще два совета, которые подскажут вам, как можно продолжать сохранять рабочие
пространства в папке My Documents, не испытывая проблем, связанных с длинными именами
файлов.
Создайте один проект набора сообщений с именем Assessor Messageset.
Откройте инструментарий брокера и выберите перспективу Broker Application Development (Разработка приложений брокера).
Выберите пункт меню File (Файл) $$\to$$ New (Новый) $$\to$$ Message Set Project (Проект набора сообщений). Введите имя Assessor Messageset, нажмите Next (Далее) и Finish (Готово).
Вы можете сразу создать и набор сообщений. Мы будем использовать другой мастер (рис 9.17).
(рис 9.17) Создание нового проекта набора сообщений
9.4.3 Создание набора сообщений
После создания проекта набора сообщений создайте набор сообщений, который будет
содержать все определения сообщений.
Щелкните правой кнопкой мыши по проекту набора сообщений, выберите пункт
меню New (Новый) $$\to$$ Message Set (Набор сообщений) и введите имя набора сообщений
proxyAssessorMessages:Установите флажок Use namespaces (Использовать пространства имен) и нажмите Next (Далее) (рис 9.18).
(рис 9.18) Флажок Use namespaces (Использовать пространства имен)
Установите флажок ).
(рис 9.19) Флажок XML Wire Format Name (Имя формата XML Wire)
Здесь вы можете изменить имя формата XML Wire, но мы оставили в этом поле
значение XML1. Это имя ассоциируется с форматом передачи данных XML, который
используется для всех определений сообщений, входящих в набор сообщений. Это
имя формата должно использоваться везде и должно совпадать с именем формата во
входящем сообщении (если оно указано). Очень легко проглядеть несовпадение
имен форматов в сообщениях, а это не даст потоку работать. Формат XML Wire можно
настраивать, и мы увидим это позже. Настроенный формат должен быть идентичен
для всех определений сообщений, входящих в набор сообщений.
(рис 9.20) Свойства набора сообщенийТеперь новый набор сообщений создан, и на экране отображается файл messageSet.
mset.
Укажите в поле Default Wire Format (Формат передачи XML по умолчанию) значение XML1 (формат по умолчанию используется, если формат не указан во входящем сообщении или во входном узле потока сообщений).
В разделе Properties Hierarchy (Иерархия свойств) файла messageSet.mset раскройте пункт Physical properties (Физические свойства) $$\to$$ XML1.
В разделе Details (Подробно) файла messageSet.mset:Установите флажок Suppress doctype (Не использовать типы документов). Объявления DTD не нужны. Система основывается на схемах, а не на DTD.
Очистите поле Root Tag Name (Имя корневого тега).
Мы используем SOAP-сообщения, где имя корневого тега должно быть Envelope.
Также система потенциально может применять встроенные сообщения. Неразумно
применять жестко определенное имя корневого тега при использовании встроенных
сообщений.
(рис 9.21) Настройка генерации XML
9.4.4 Импортирование схем в брокер
Далее импортируйте файлы схем в рабочее пространство инструментария Broker
Toolkit. Вы можете организовать импорт схем, поместив файлы схем, относящиеся
к каждому проекту набора сообщений, в соответствующий проект, или же можно
импортировать все схемы в общую папку.
В перспективе Broker Application Development перейдите в окно Resource Navigator
(Навигатор ресурсов), щелкните правой кнопкой мыши по элементу proxyAssessorSystem и выберите пункт меню File (Файл) $$\to$$ Import (Импорт) $$\to$$ File system (Файловая система) $$\to$$ Next (Далее):Перейдите к директории, в которой находятся файлы схем, и отметьте файлы,
которые вы хотите импортировать.
В качестве пункта назначения для импортированных ресурсов уже должна
быть указана система proxyAssessorSystem. Установите флажок Create
selected folders only (Создавать только указанные папки) и нажмите Finish
(Готово).
Проверьте схемы, открыв и изучив их графическое представление и сравнив их
с исходными WSDL-файлами (рис 9.22).
Используя представление Outline (Общий обзор), выберите схему верхнего уровня
или выберите верхний уровень на графической закладке. Затем откройте закладку
Design редактора свойств и убедитесь, что в поле целевого пространства
имен указано нужное вам пространство.
Последнее, что нужно импортировать, – это файл схемы, который описывает
SOAP-сообщения. При помощи Web-браузера посетите сайт World Wide Web
Consortium (W3C):
http://schemas.xmlsoap.org/soap/envelope/
Сохраните схему для SOAP 1.1.
(рис 9.22) Схема RequestAssessorAvailablity
9.4.5 Использование схем для создания MDF
Теперь, когда все наши файлы схем находятся в рабочем пространстве Broker Toolkit,
мы можем использовать их для заполнения файлов определений сообщений (message
definition file, MDF).
В перспективе Broker Application Development, в окне Resource Navigator (Навигатор
ресурсов), щелкните правой кнопкой мыши по файлу схемы, который вы хотите
использовать в качестве источника определений сообщений. Выберите пункт
меню New (Новый) $$\to$$ Message Definition File (Файл определения сообщений).
Переключатель XML schema file (Файл XML-схемы) должен быть включен. Нажмите Next (Далее). Выберите применяемый файл схемы и нажмите Next (Далее).
Выберите проект Assessor Messageset, который вы создали, и нажмите Next (Далее).
Установите флажки выбора глобальных элементов и нажмите Finish (Готово).
Вы создали новый файл определений сообщений (.mxsd). Повторите данные шаги
для каждого файла схемы. Вы должны получить 10 сообщений об ошибках, связанных
с конфликтом имен (рис 9.23).
(рис 9.23) Ошибки при импортировании определений сообщений в один набор сообщенийУстранение дубликатов имен и типов
Легче всего устранить шесть ошибок, помеченных буквами А. Эти ошибки вызваны
тем, что поток 3 и поток 4 используют одинаковые имена сообщений. Высокоуровневые
элементы сообщения применять необязательно, поскольку в действительности
мы будем использовать сообщение-конверт SOAP (SOAP envelope).
Оставшиеся четыре ошибки вызваны дубликатами типов CarDetails и AssessorAckMessage
в одном пространстве имен. В данном случае нам повезло. Это полные
дубликаты, и мы можем удалить один из дублей, заменив его ссылкой. Если бы типы
имели одинаковые имена и пространства имен, но при этом различались, то у нас
было бы только два варианта: заставить одну из команд разработки изменить определения
в исходных материалах и внести изменения везде, где изменения определений
на что-то повлияли, или использовать несколько наборов сообщений для хранения
конфликтующих типов.
Решение проблемы дублирования имен сообщений
Эта ошибка, возникающая, даже если сообщения находятся в разных пространствах
имен, вызвана тем, что версия 5 WebSphere Business Integration Message Broker не использует
в данной ситуации пространства имен для различения сообщений. Возможно,
это будет исправлено в версии 6.
Для решения проблемы дублирования имен сообщений, выполните следующие
действия:
(рис 9.24) Удаление дубликатов сообщенийОткройте файл определений сообщений AssessorAvailablity(3) и выберите папку Messages. На рис 9.24 мы используем для этого представление Outline (Общий обзор).
Удалите сообщения requestAssessorAvailablity и requestAssessorAvailabilityReponse и сохраните файл определений.
Число ошибок уменьшится до четырех.
Решение проблемы дублирования типов
Эта процедура несколько более хитрая. Проблема показана на рис 9.25.
(рис 9.25) Конфликт типовТип AssessorAckMessage в пространстве имен itso.lgi.broker имеет дубликаты, которые
обведены на левой половине рисунка. Тип CarDetails дублируется в пространстве
имен itso.assessor, как показано в правой части. Обратите внимание, что в пространстве
имен itso.assessor есть дубликат типа AssessorAckMessage, но это не представляет
проблемы, поскольку этот дубль находится в другом пространстве имен.
Важно! Если разница пространств имен позволяет нам дублировать определение
AssessorAckMessage, это не означает, что наш код понятен. Сами определения или их смысл
могут быть иными. Однако такая ситуация обычна при интеграции корпоративных приложений.
Не делайте никаких допущений. Эти структуры и их определения могут происходить из разных
организаций или отражать разные версии. На имена и пространства имен не всегда можно
полагаться.
Мы удалим тип AssessorAckMessage из AssessorReport(8) и заменим его ссылкой на
определение в DeliverAssessment(7).
Откройте в представлении ).
(рис 9.26) Тип AssessorAckMessage в сообщении AssessReport(8)
Удалите тип и нажмите OK в появляющемся сообщении для подтверждения удаления элемента receiveAssessorReportReturn.
Выделите сообщение receiveAssessorReportResponse, щелкните правой кнопкой мыши и выберите пункт меню Add Local Element (Добавить локальный элемент). Введите значение receiveAssessorReportReturn, чтобы восстановить элемент.
Новый элемент отобразится в окне редактора определения сообщения. Выберите string в столбце Type (Тип), а в раскрывающемся списке выберите More (Еще).
Выберите тип показано восстановленное сообщение-ответ.
(рис 9.27) Заново созданное сообщение-ответ receiveAssessorReportResponse
Используя сходную процедуру, удалите одно из определений CarDetails.
Удалите тип CarDetails. Нажмите OK в предупреждающем сообщении.
Откройте элемент requestAssessorAvailability в редакторе определения сообщения. Щелкните правой кнопкой мыши по элементу ** Anonymous **, выберите пункт меню Add Local Element и введите имя cardet.
Укажите тип (рис 9.28) Определение и ссылка на определение CarDetails в сообщении Availability(4)
Перетащите элемент .
(рис 9.29) Заново созданный элемент requestAssessorAvailability
Сохраните файл определений сообщений. Теперь все ошибки должны быть исправлены.
9.4.6 Настройка SOAP MDF (soap11.mxsd)
У нас есть несколько вариантов определения конверта SOAP, в который заключаются
схемы сообщений.
Добавить необходимые SOAP-теги для обработки входящих сообщений и создать исходящие сообщения, используя знание спецификации SOAP без воссоздания правил и ограничений для правильно сформированных SOAP-сообщений.
Использовать импортированную нами SOAP-схему для определения SOAP-сообщений. Мы можем применять эту схему для проверки правильности входящих SOAP-сообщений и для обеспечения правильного формирования наших собственных SOAP-сообщений.
Для файла определения сообщений, созданного при помощи сданной схемы, будут
выводиться предупреждения, поскольку модель сообщений MRM не полностью
совпадает с XML-схемами. Мы можем решить эту проблему несколькими способами:
Игнорировать предупреждения. В представлении Tasks (Задачи) есть параметр фильтра, позволяющий удалять какие-то предупреждения из задач или все предупреждения.
Стереть исходный файл схемы, удалив причину предупреждений.
Отредактировать файл определения сообщения, используя редактор брокера, и усовершенствовать проверки с использованием модели сообщений MRM на основе редактирования SOAP-спецификации, дополнив правила, указанные в определении схемы.
Мы выбрали вариант "с" – с редактированием файла определения сообщения для
улучшения проверки SOAP-сообщений. Нужно выполнить два следующих действия:
Создать файл определения SOAP-сообщения из SOAP-схемы.
Изменить определение схемы SOAP-сообщения, чтобы избавиться от предупреждений и "улучшить" проверку.
Создание файла определения SOAP-сообщения
Схема SOAP 1.1 будет вызывать ошибку при преобразовании в файл определения сообщений;
поэтому, прежде чем продолжить, нам нужно изменить ее. Брокер не поддерживает
атрибуты списков. Откройте импортированную схему SOAP 1.1 в редакторе
схем брокера, переключитесь на представление Source (Исходный код) и внесите
изменения в соответствии с примером 9.8.
Строка (<xs:list ... >) блокируется символом
комментария и добавляются строки, начинающиеся с (<xs:restr ... >).
<xs:simpleType name="encodingStyle">
<xs:annotation>
<xs:documentation>'encodingStyle' indicates any canonicalization
conventions followed in the contents of the containing element. For
example, the value 'http://schemas.xmlsoap.org/soap/encoding/'
indicates the pattern described in SOAP specification
</xs:documentation>
</xs:annotation>
<!-- <xs:list itemType="xs:anyURI" /> -->
<xs:restriction base='xs:string'>
<xs:pattern value='http://schemas.xmlsoap.org/soap/encoding%' />
</xs:restriction>
</xs:simpleType>
Создайте новый файл определения сообщения в проекте Assessor Messageset, преобразовав
измененную схему SOAP 1.1. Назовите это определение сообщения SOAP11.
Вы увидите 13 предупреждений.
Примечание. Из файла SOAP.xsd используйте только глобальный элемент Envelope, по
которому создается сообщение. Делается это для того, чтобы потоки сообщений могли
распознать это сообщение как обрабатываемое. Оставьте опции Header, Body и Fault
неотмеченными, как показано на рис 9.30.
(рис 9.30) Выбор из SOAP-схемы только конверта
Создание SOAP-оболочки для сообщений
С помощью редактора файла определений сообщений внесите описанные ниже
правки, что позволит избавиться от предупреждений и сжать проверку корректности
SOAP-сообщений.
Удалите элементы Wildcard из элементов .
Удалите атрибут Wildcard из элемента Body.
Удалите пространства имен из трех оставшихся атрибутов Wildcard, показанных на рис 9.31. Для этого выделяйте каждый атрибут по очереди и открывайте закладку Properties (Свойства) вместо закладки Overview (Обзор) в редакторе определений сообщений (рис 9.32).
(рис 9.32) Элементы, которые нужно отредактировать в схеме SOAP 1.1(рис 9.31) Удаление пространства имен из атрибутов WildcardСовет. Быстрее всего будет использовать представление Outline для выбора атрибутов, а затем
вам нужно один раз перейти на закладку Properties (Свойства).
Установите в поле Content Validation (Проверка содержимого) для сложного
типа Envelope значение OpenDefined (изначально там указано значение Closed )
(рис 9.33). Это означает, что потомками типа Envelope могут быть только атрибуты,
определенные в данном наборе сообщений. Явными потомками его являются (рис 9.33) Параметр Content validation для сложного типа Envelope устанавливается в Open Defined
Установите в поле Content Validation (Проверка содержимого) для сложных типов Header и Detail значение Open (вместо установленного там Closed). Это
означает, что здесь допустимо использовать любые атрибуты. Заголовки SOAP не
являются обязательными, поэтому значение Min Occurs (Минимальное число
вхождений) можно установить равным нулю, но такое значение не поддерживается в MRM, поэтому мы оставим значение 1.
Укажите в поле Complex type (Сложный тип) элемента Body вариант Composition,
а в поле Content Validation (Проверка содержимого) – значение OpenDefined. Это позволит использовать в качестве потомка элемента Body любой
из элементов импортированной схемы, но не элементы, отсутствующие в схеме.
Удалите шаблон (pattern facet) глобального атрибута mustUnderstand, поскольку
он не является необходимым, и его удаление устраняет предупреждение, выдаваемое
инструментарием Broker Toolkit (рис 9.34).
(рис 9.34) Удаление шаблона из атрибута mustUnderstandПримечание. Данный шаблон представляет собой определение того, какие значения может
принимать переменная. Булев тип имеет шаблон 0|1, что делает его похожим на перечислимый
тип.
Добавьте в схему SOAP элемент Fault как потомок элемента Body. Для этого выделите
элемент Body, щелкните правой кнопкой мыши и выберите пункт меню Add
element reference (Добавить ссылку на элемент) (рис 9.35).
(рис 9.35) Добавление ссылки на элемент в элемент Body
Прокрутите список до элемента ).
(рис 9.36) Выбор ссылки на элемент Fault
В том же окне укажите для элемента Fault в поле Min Occurs (Минимальное число вхождений) значение 0 и сохраните изменения. Вы увидите, что все предупреждения исчезли.
Выполнив данные шаги, мы создали SOAP-оболочку для наших сообщений. Теперь
нам нужно ввести сообщения в эту оболочку.
9.4.7 Создание SOAP-сообщений
При наличии SOAP-оболочки нам нужно выполнить еще пару шагов, чтобы завершить
создание SOAP-сообщений в брокере:
Сохранить SOAP-оболочку для последующего использования, чтобы не приходилось проходить процедуру редактирования заново.
Ввести сообщения Assessor в поле Body оболочки SOAP.
Сохранение оболочки SOAP
Мы экспортируем оболочку SOAP в виде файла XML-схемы, и ее можно будет
использовать в других проектах наборов сообщений в будущем.
Выберите файл определения сообщения SOAP11.mxsd в навигаторе ресурсов,
выберите пункт меню New (Новая) $$\to$$ XML Schema (XML-схема). Выберите wire-формат XML1 и убедитесь в том, что файл SOAP11.mxsd выделен. Выберите пункт Strict Generation (Точная генерация) $$\to$$ Next (Далее), создайте новую папку для
хранения XML-схемы (например, Generated) и нажмите Finish (Готово).
Внимание! Сложный тип Header, созданный при импорте исправленного файла SOAP11.xsd,
имеет в поле Content Validation (Проверка содержимого) значение Closed. Укажите здесь
значение Open. Также исправьте данный параметр в трех других типах. Предупреждения
исчезнут, когда вы сохраните файл.
Преобразование сообщений Assessor в SOAP-сообщения
Последняя задача в создании набора сообщений – это объединение определения
SOAP с каждым из 10 сообщений Assessor. Мы сделаем это путем импортирования
файлов определений сообщений Assessor в файлы определений SOAP-сообщений,
а затем сделаем сообщения Assessor потомками элементов Body SOAP-сообщения.
Начнем с определения сообщения AllocateAssessment(6).
Импортируйте файлы определений сообщений (MDF), представляющие службы
Assessor в SOAP MDF:Выделите файл SOAP11.mxsd в навигаторе ресурсов и перейдите на закладку
Properties (Свойства) редактора определений сообщений, как показано
на рис 9.37.
(рис 9.37) Импорт сообщений Assessor в SOAP-сообщение
Щелкните правой кнопкой мыши по пункту Imports (Импорты) $$\to$$ Add (Добавить),
выделите файл определения сообщения (рис 9.38) Импортирование определения сообщения Assessor в определение сообщения SOAP
Повторите эту операцию для всех файлов определений сообщений, как показано на рис 9.39.
(рис 9.39) Все импортированные файлы определений сообщений
Теперь, когда мы можем ссылаться в SOAP MDF на сообщения Assessor данного
проекта, добавим глобальные элементы сообщений Assessor в качестве потомков
в элемент SOAP Body:При выделенном файле определения SOAP11.mxsd откройте закладку Overview
(Общий обзор) и раскройте структуру .
(рис 9.40) Добавление элементов Assessor в качестве потомков в элемент Body и задание параметра Min Occurs
Щелкните правой кнопкой мыши по элементу Body, выберите пункт меню Add Element Reference (Добавить ссылку на элемент) и добавьте все элементы.
Укажите для параметра minOccurs (Минимальное число вхождений) каждой из структур значение 0, поскольку ни одна из них не является обязательной.
Повторите процедуру для остальных 16 элементов верхнего уровня, как показано
на рис 9.41 и 9.42.

(рис 9.42) Все 17 сообщений Assessor в оболочке(рис 9.41) Проверка источника, на который ссылается элементСовет. Размещение всех этих ссылок в оболочке SOAP сложно выполнить правильно, поэтому
нужно все тщательно проверять.
Сложно связать имена в ссылках на элементы с именами элементов:Префиксы, которые мы добавили для различения сообщений, были урезаны, префиксы дублирующихся пространств имен – потеряны.
Нет квалификаторов пространств имен, которые помогли бы выбрать правильный элемент. Лучше всего щелкнуть один раз правой кнопкой мыши по вставленной ссылке на элемент, выбрать пункт меню Go To Declaration (Перейти к объявлению) и убедиться в том, что ссылка указывает на нужный элемент (рис. 9.42).
Ведите работу систематически. Мы добавляли ссылки в том порядке, в котором идут потоки, придерживаясь вида, показанного на рис. 9.11 и 9.12.
В конце подсчитайте количество ссылок. Их 17. Это число должно совпадать с числом определений элементов. Три потока представляют собой односторонние SOAP-сообщения, поэтому число интерфейсов в них меньше в два-три раза.
Проверьте, чтобы не было дублирующихся ссылок.
Убедитесь в том, что все ссылки являются потомками элемента Body и ни один из них не был записан к другому предку.
Убедитесь в том, что все значения Min Occurs равны нулю. Все эти элементы необязательные.
9.5 Реализация таблиц баз данных
База данных с этими таблицами должна располагаться на машине SAH414A, локальной
для брокера сообщений. Сначала создадим на SAH414A базу данных и схему, затем
создадим таблицы и, наконец, импортируем схемы и таблицы в рабочее место
WebSphere Business Integration Message Broker, чтобы их можно было использовать
в потоках сообщений.
9.5.1 Создание базы данных Assessor
Чтобы создать базу данных Assessor, выполните следующие шаги:
Запустите центр управления DB/2 на SAH414A. Запустите мастер создания баз данных, как показано на рис 9.43.
(рис 9.43) Мастер создания баз данных
Назовите базу данных ASSESSOR (рис 9.44).
(рис 9.44) Создание базы данных ASSESSOR
Поскольку объем реальной памяти для SAH414A ограничен, мы настроили использование
памяти базой ASSESSOR (рис 9.45).
(рис 9.45) Уменьшение памяти для базы данных
9.5.2 Создание схемы и таблиц
Выполните следующие шаги для создания схемы и связанных с ней таблиц.
С помощью центра управления DB/2 создайте новую схему и назовите ее EMERGE (рис 9.46).
(рис 9.46) Создание схемы EMERGE
Щелкните правой кнопкой мыши по папке Tables (Таблицы), выберите пункт меню
Create (Создать), укажите схеме EMERGE и назовите новую таблицу
CLAIMASSESSOR (рис 9.47).
(рис 9.47) Создание таблицы CLAIMASSESSOR
Используя данные, приведенные в таблица 9.5).
(рис 9.48) Создание столбцов в таблице CLAIMASSESSOR
Определите два ключевых поля, назвав ограничение CA1 (рис 9.49).
(рис 9.49) Определение ключей для CLAIMASSESSOR
Повторите процесс, используя данные в таблица 9.6).
(рис 9.50) Таблица ACTIONASSESSOR
Таблица RESOLVEASSESSOR показана на рис 9.51.
(рис 9.51) Таблица RESOLVEASSESSOR
9.5.3 Соединение базы данных с рабочим местом брокера
Чтобы присоединить базу данных, выполните следующие шаги:
Откройте из рабочего места перспективу Data (Данные) и щелкните правой кнопкой
мыши в представлении DB Servers (Серверы БД). Выберите пункт меню New
Connectio n (Новое соединение) (рис 9.52).
(рис 9.52) Новое соединение с базой данных в Workbench
Заполните форму, как показано на рис 9.53.
(рис 9.53) Определение соединения с базой данных
Импортирование базы данных в проекты брокера сообщений
Создав соединение между рабочим местом и базой данных ASSESSOR, мы хотим создавать
схемы и таблицы прямо из рабочего места. Для этого нам нужно импортировать
соединение с базой данных в проект в рабочем месте, который мы будем использовать
для разработки таблиц.
Создайте проект потока сообщений (Message Flow) с именем ASSESSOR database.
Мы обнаружили, что размещение определения базы данных в простом проекте
приводит к появлению предупреждений, связанных с неидентифицируемыми сообщениями.
Если разместить определение базы в проекте потока сообщений, такого
не происходит. При создании проектов потоков сообщений, связывайте
с каждым из них новую папку в перспективе Broker Application Development.
Выделите элемент ASSESSOR в представлении DB Servers (Серверы БД) (выполнив
повторное соединение, если это необходимо). Выберите пункт Import to folder
(Импортировать в папку), выберите папку базы данных ASSESSOR. Нажмите Finish
(Готово) (рис 9.54).
(рис 9.54) Импортирование нового соединения с базой данных в Workbench
Щелкните правой кнопкой мыши по файлу ASSESSOR_ASSESSOR.dbmxmi в папке
базы ASSESSOR, выберите пункт меню New (Новый) $$\to$$ Other (Другое) $$\to$$ Schema
Definition (Определение схемы) $$\to$$ Next (Далее). Укажите схему EMERGE и нажмите Finish (Готово).
Теперь база данных ASSESSOR импортирована в Workbench. Ссылки на базу дан-
ных в инструкциях ESQL будут заполняться автоматически.
(рис 9.55) Проект базы данных ASSESSOR
9.6 Создание потоков сообщений
В этом разделе большая задача по созданию всех потоков сообщений разбита на четыре меньших этапа:
Создание проектов потоков сообщений и зависимостей.
Создание файлов потоков сообщений.
Соединение потоков сообщений (разделы 9.6.2 – 9.6.5) и настройка параметров узлов.
Написание esql-кода для всех вычислительных узлов.
9.6.1 Создание проектов потоков сообщений и зависимостей
Изучите дизайн организации потоков сообщений в разделе 9.3.2, "Потоки сообщений
и независимость от транспортных протоколов".
Хорошая организация потоков сообщений упрощает понимание решения и управление
им. Существует два набора транспортно-независимых потоков: потоки,
связанные с готовностью оценщика, 3, 3a, 4 и 4a и потоки, связанные с отчетом об
оценке 6, 6a, 7, 7a, 8 и 9. Мы используем два проекта потоков сообщений для
транспортно-независимых потоков, чтобы было понятно, где мы работаем с готовностью
(Availability), а где – с отчетами (Report).
Этим двум наборам транспортно-независимых потоков будут соответствовать два
набора транспортно-специфических потоков для протокола SOAP/http. Наконец, будет
проект потока сообщений для общих потоков SOAP/http.
В табл. 9.9 перечислены все проекты потоков сообщений – потоки, которые мы
будем создавать и их зависимости. Взаимоотношения между потоками, а также между
потоками и набором сообщений должны быть определены таким образом, чтобы
ссылки на потоки и наборы могли быть корректно разрешены. Мы также определим
пакеты для потоков сообщений, чтобы потенциально дублирующиеся имена потоков
можно было корректно различить. Эти пакеты называются схемами брокера.
Все потоки используют общую схему брокера, так что символьные ссылки разрешаются
в пределах этой схемы и путаницы с аналогично названными ресурсами из
других проектов не возникнет.
Зависимости между проектами потоков сообщений и проектами наборов сообщений
определяются в Workbench либо при создании нового проекта, либо позже,
с использованием графического интерфейса Workbench.
Создайте первый проект потока сообщений (рис 9.56). Выберите пункт меню File (Файл) $$\to$$ New (Новый) $$\to$$ Message Flow Project (Проект потока сообщений).
Введите имя AvailabilityFlows и нажмите (рис 9.56) Создание нового проекта потока сообщений
Создайте другие проекты потоков сообщений, перечисленные в табл. 9.9.
Добавьте зависимости, указанные в табл. 9.9, выбирая по очереди каждый проект,
набор сообщений и открывая его свойства (рис 9.57).
(рис 9.57) Зависимости в представлении Properties (Свойства)Проекты потоков сообщений и потоки сообщений
| Проект потока сообщений |
Поток сообщений |
Набор сообщений и база данных |
| Группа B
CommonSOAPHttpFlows
Зависимости: группа A |
Common.esqlЭто не поток, а общий модуль .esql. Мы будем использовать его позже. |
Группа A: Assessor Message Set
База данных ASSESSOR |
| Fault |
| Reply |
| ClientError |
| Группа C
AssessorReportFlows
Зависимости: группы A, B, D |
Flow6 |
| Flow6a |
| Flow7 |
| Flow7a |
| Flow8 |
| Flow9 |
| Группа D
AssessorReportSOAPHttpFlows
Зависимости: группы A, B, C |
Flow6aAck |
| Flow9Ack |
| Input6 |
| Output6a |
| Output7 |
| Output9 |
| Группа E
AvailabilityFlows
Зависимости: группы A, B, F |
Flow3 |
| Flow3a |
| Flow4 |
| Flow4a |
| Группа F
AvailabilitySOAPHttpFlows
Зависимости: группы A, B, E |
Flow3aAck |
| Input3 |
| Output3a |
Создайте схему брокера в каждом проекте потока сообщений:Выберите пункт меню File (Файл) $$\to$$ New (Новый) $$\to$$ Broker Schema (Схема брокера). Выберите один из проектов потоков сообщений и назовите схему proxyAssessorSystem. Нажмите Finish (Готово).
Скопируйте и вставьте схему в остальные проекты потоков сообщений.
(рис 9.58) Схема брокера
Создайте все файлы потоков сообщений, указанные в таблица 9.9)
(рис 9.59) Потоки сообщений
Настройте зависимости проекта набора сообщений и проектов потоков сообщений, как показано в таблице.
9.6.2 Создание потоков сообщений
В разделах 9.6.3 – 9.6.5 мы свяжем и сконфигурируем все потоки сообщений начиная
с общих потоков, а затем потоки, относящиеся к готовности и отчетам. Конфигурируются
все параметры потоков, а также топология потоков. Останется только запрограммировать
набор ESQL-файлов.
9.6.3 Создание потоков CommonSOAPHttpFlows
К общим потокам, которые нам нужно разработать, относятся подпотоки Fault
(Ошибка) и Reply (Ответ). Мы также должны создать каркасную процедуру Validate
SQL в файле common.esql, чтобы на нее могли ссылаться другие потоки.
Fault
Поток Fault возвращает правильно сформированное SOAP-сообщение, содержащее
информативное описание причины ошибки и правильно сформированный SOAP-код ошибки.
Данный подпоток используется для базовой обработки ошибок во всех потоках
сообщений. Он вызывается из входного узла любого потока сообщений при возникновении
исключения. Мы применяем одну и ту же процедуру обработки ошибок для
всех наших потоков сообщений. Эта процедура связана с терминалами Failure и Catch
входных (Input) узлов. Все прочие терминалы ошибок в потоках сообщений остаются
неподключенными, поэтому все исключения направляются через входной узел
в данную процедуру. За дополнительной информацией обращайтесь к интерактивной
справочной документации WebSphere Business Integration Message Broker,
"Handling errors in message flows".
Как и во всех подпотоках, начните поток с входного узла.
Создайте узел TryCatch. Мы не хотим, чтобы неперехваченные ошибки приводили к рекурсивному вызову потока Fault, поэтому мы добавляем узел TryCatch и направляем перехваченные им ошибки на трассировочный узел.
Создайте вычислительный узел Identify fault для создания сообщения об ошибке. Реализация узла Identify fault, как и всех остальных вычислительных узлов, вставляемых в потоки на данной стадии, описывается в разделе, посвященном разработке ESQL.
(рис 9.60) Поток ошибокПока же щелкните правой кнопкой мыши по узлу Identify fault, выберите пункт
меню Open ESQL, переименуйте ESQL-модуль в Fault_Identify_Fault и сохраните созданный
ESQL-файл. Убедитесь, что ESQL-модуль идентифицируется в параметре
ESQL Module, как показано на рис 9.61.
(рис 9.61) Указание пути к модулю ESQLСовет. Давайте ESQL-модулям информативные имена. Хорошей практикой является начинать
имя с имени потока и добавлять суффикс в виде имени вычислительного узла. Таким образом
код esql будет проще найти, и меньше будет вероятность выбрать неверный ESQL-модуль при
прямом открытии ESQL-файлов через навигатор.
Создайте узел HttpReply, который будет возвращать ошибку.
Создайте три трассировочных узла, которые помогут в будущем отладить поток.
Существует множество соглашений, которым нужно следовать и которые помогают
при отладке. Мы используем соглашение, связанное с применением зарезервированных
в каталоге сообщений WebSphere Business Integration Message Broker номеров
сообщений с 3051 по 3099, используем вывод в журнал событий Windows.
Каждый трассировочный узел имеет имя, соответствующее номеру ошибки, чтобы
можно было быстро выявить источник ошибки в потоке (рис 9.62).
(рис 9.62) Конфигурирование трассировочного узла
Соедините узлы и сохраните их. Используйте инструмент Connection (Соединение)
из палитры (рис 9.63).
(рис 9.63) Использование инструмента Connection для соединения узлов
Reply
Подпоток Reply (Ответ) – это простой узел HttpReply.
Создание подпотока Reply имеет две причины:
Для упаковки: при использовании другого транспорт-специфического проекта потока вместо проекта HttpSOAP связи подпотоков останутся теми же, будет использован только другой узел Reply.
Подпоток может быть более сложным при использовании других типов транспорта, и эта сложность будет заключена в потоке Reply.
(рис 9.64) Подпоток Reply
ClientError
Поток ClientError (Клиентская ошибка) просто отслеживает ошибки, возвращаемые
брокеру Web-службами или обнаруженные в клиентских потоках, и отправляет их
в журнал событий (рис 9.65).
(рис 9.65) Поток ClientErrorПозже, не затрагивая основного потока, можно будет добавить более сложную
обработку ошибок, с непрямой трассировкой ошибки до подпотока. Трассировочный
узел 3062 выводит дерево исключений и другую полезную информацию. На рис 9.66
показано, как вывести на экран все деревья брокера.
(рис 9.66) Задание шаблонных значений для трассировочного узла ClientError
9.6.4 Создание потоков AvailabilityFlows
На рис 9.67 показаны потоки AvailabilityFlows, которые нужно определить.
(рис 9.67) Потоки AvailabilityFlowsПоток Input3
Поток Input3 получает сообщение RequestAvailability от процесса ExternalClaimAssessors
и передает его потоку 3 (Flow3) для проверки и обработки. Исключения перехватываются
и передаются в процедуру Fault для возврата ошибки SOAP (рис 9.68).
(рис 9.68) Поток Input3Сконфигурируйте узел Http Input следующим образом:На закладке Basic (Общие) установите в поле URL Selector (Выбор URL) значение,
предоставленное архитектором решения в файле AssessorAvailablity(3).
wsdl: http://SAH41403:7080/RequestAssessorAvailability, и значение тайм-аута
60 секунд.Внимание! TCP/IP порт 7080 является портом слушателя по умолчанию для брокера сообщений.
Он задается командой mqsicreatebroker (-P номерпорта) и изменяется командой
mqsichangebroker.
На закладке Default (По умолчанию) укажите свойства набора сообщений так, как показано на рис 9.69.
(рис 9.69) Свойства набора сообщений для узла Http Input
На закладке Validation (Проверка) укажите в поле Validate (Проверять) значение Content and Value (Содержимое и значение).
Поток Flow3
Данный поток сообщений получает сообщение от потока Input3, проверяет его, посылает
назад ответ-подтверждение и вызывает поток 4 (flow4) для распределения сообщения
по оценщикам (рис 9.70).
(рис 9.70) Основа потока 3Создайте следующие узлы:Вычислительный узел Validate для проверки входящего сообщения.
Мы напишем код ESQL позже, в разделе 9.7.4, "ESQL-код обработки ошибок".Сейчас откройте код ESQL через пункт меню, появляющегося при нажатии правой кнопки мыши, и сохраните код, заданный по умолчанию (рис 9.71).
(рис 9.71) Для создания ESQL-модуля по умолчанию выберите пункт меню Open ESQL (Открыть ESQL)Это позволит устранить ошибку компиляции.
На закладку Basic (Общие) страницы Properties (Свойства) вычислительного
узла (рис 9.72) установите в поле Data Source (Источник данных) схему
EMERGE, а в поле Compute Mode (Режим вычислений) оставьте значение Message
(Сообщение). Это опция, установленная по умолчанию, которая позволяет
любым изменениям, вносимым в папки сообщений в данном режиме, распространяться
на последующие узлы. Мы устанавливаем в поле Compute
Mode (Режим вычислений) значения Message и LocalEnvironment для узлов,
которые должны изменять и распространять агрегационную информацию,
хранящуюся в дереве LocalEnvironment, а также в дереве сообщений.
(рис 9.72) Установка общих свойств вычислительного узла
На закладке Validation (Проверка) установите в поле Validate (Проверять)
значение Content and Value (Содержимое и значение), как показано на
рис 9.73. Эту опцию можно отключить по окончании тестирования для
увеличения производительности работающей системы.
(рис 9.73) Установка параметров проверкиПримечание. В дальнейшем мы предполагаем, что эти параметры вычислительных узлов
и проверки установлены на всех узлах, которые занимаются передачей информации в папках.
Создайте связующий узел Create Reply, который будет связывать ответ с сообщением-подтверждением.
Создайте подпоток Flow4. Создайте пока пустой подпоток, добавив в Flow4 узел Input и сохранив его. Теперь можно добавить подпоток Flow4 в Flow3 еще до того, как будут определены детали Flow4. Перетащите Flow4 в Flow3.
Подпоток Reply. Перетащите поток Reply в поток Flow3.
Теперь сконфигурируем узел соответствия.
Конфигурирование связующего узла Create Reply
Выполните следующие шаги:
Щелкните правой кнопкой мыши по связующему узлу Create Reply и выберите пункт меню Open Mappings (Открыть связи).
Щелкните правой кнопкой мыши по окну Source (Источник) и выберите пункт меню ).
(рис 9.74) Выбор конверта SOAP для связи сообщений
Раскройте схемы сообщений и свяжите claimID в сообщении-источнике и в сообщении-цели.
Щелкните правой кнопкой мыши по элементу TimeStamp и выберите пункт меню Create one-sided mapping (Создать одностороннюю связь).
Нажмите на кнопку с тремя точками справа от слова ).
Сохраните файл связей.

(рис 9.76) Установление связей Flow3_Create_Reply(рис 9.75) Указание значения CURRENT_TIMESTAMP
Поток Flow4
Этот поток сообщений (рис. 9.77) получает проверенное сообщение от потока flow3
и генерирует одно или несколько сообщений, которые распространяются между
оценщиками.
(рис 9.77) Поток Flow4Он также обновляет таблицу CLAIMASSESSOR базы данных, сохраняя информацию,
которая должна быть вставлена в сообщения-ответы, возвращаемые в процесс
ExternalClaimAssessors.
Входящее сообщение содержит URL оценщика. Для ответа, возвращаемого процессу
ExternalClaimAssessors в потоке Flow3a, также нужен URL оценщика, поэтому
мы сохраняем его и будем извлекать позже, используя claimID и assessorID.
Нам нужно сохранить идентификаторы всех сообщений (msgid) для всех сообщений
потока Flow4, чтобы можно было устанавливать корреляцию с ответами
оценщиков. Мы не можем делать допущение о том, что ответы будут содержать
корреляционный ID (correlationId) WebSphere MQ, поскольку нам нужно реализовывать
решение с использованием транспортного протокола SOAP/http и других
протоколов.
Поток Flow4 генерирует уникальный идентификатор msgid для сообщения, посылаемого
оценщику, путем создания реального сообщения WebSphere MQ и отправки
его в узел агрегации с сохранением msgid в базе CLAIMSASSSESSOR для воссоздания
корреляционного идентификатора при последующей агрегации.
Ниже приводятся данные о конфигурации потока.
Мы начинаем с узла TryCatch для предотвращения возврата ошибок клиенту брокера.
Клиент брокера не ожидает никаких сообщений об ошибке, поскольку он
уже получил подтверждение. Любые ошибки, возникающие здесь, обрабатываются
брокером путем передачи управления в общую процедуру ClientError.
Используйте узел DataDelete для удаления старого экземпляра претензии из базы
данных. Обратите внимание, что, если удаление производится средствами SQL,
а указанный claimID не обнаруживается, возвращается предупреждение (соответствующее
положительному номеру ошибки SQL). Данный узел по умолчанию
сконфигурирован на игнорирование предупреждений [Опция Treat Warnings As
Errors (Обрабатывать предупреждения как ошибки) в свойствах узла должна быть отключена.] За инструкциями по конфигурированию узла DataDelete обращайтесь
к разделу "Конфигурирование узла Data Delete с именем Delete claim status".
Узел Prepare MQ удаляет HTTP-данные из папок сообщения и подготавливает папку
MQ перед передачей папок в узел Aggregate Control.
Это этап, связанный с защитным программированием. Мы не знаем, может ли
функция агрегации воспринимать разные типы папок на разных узлах. Поскольку
мы будем использовать WebSphere MQ в качестве интерфейса к узлам
агрегирования, мы делаем так, чтобы для всех узлов агрегирования поток
сообщений выглядел сходно с WebSphere MQ.
В узле Aggregate Control присвойте агрегату имя proxyAssessorSystem и укажите
тайм-аут для узла Aggregate Reply. Для тестирования мы устанавливаем здесь значение,
равное 115 секундам (рис 9.78).
(рис 9.78) Свойства узла Aggregate Control
Вычислительный узел Fan out передает новое сообщение-запрос каждому оценщику,
указанному во входящем массиве оценщиков. Также этот узел сохраняет
HTTP URL для маршрутизации сообщения в локальном окружении (Local
Environment). На этой стадии просто сгенерируйте ESQL-модуль по умолчанию
для этого вычислительного узла, которому присвойте имя Flow4_Fan_Out:. (К реализации
этого узла мы вернемся позже.)URL-адрес нужно где-то сохранить для последующего использования при создании
HTTP-сообщения-запроса к оценщику, поскольку в папке сообщения URL не
содержится. Мы также собираемся сохранить URL в базе данных CLAIMASSESSOR,
возвращаемой в процесс ExternalClaimAssessor, как это определяется в его
интерфейсе. Данный URL можно было бы сохранить в базе данных на этом этапе
и прочитать позже, при задании URL пункта назначения. Нам пришлось бы сделать
это таким способом, если бы мы решили считывать сообщение-запрос из очереди
Assessor, а не соединять оставшуюся часть потока с выходным терминалом узла
MQOut Assessor. Передача URL в локальное окружение (local environment) –
несколько более эффективный способ, поэтому мы выбрали этот подход.
Вычислительный узел PrepareMQControl передает сообщение для отправки на управляющий
терминал узла AggregateReply в потоке Flow3a. Снова сгенерируйте ESQL-модуль
по умолчанию с именем Flow4_Control_Message.
Узел MQOutput, с именем MQOut Flow3a, посылает управляющее сообщение потоку
Flow3a. Укажите в поле Queue Name (Имя очереди) на закладке Basic (Общие)
значение FLOW3A.CONTROL. Поле Queue Manager (Менеджер очереди) оставьте
пустым, чтобы использовался заданный по умолчанию менеджер очереди.
На всех остальных закладках оставьте значения по умолчанию.На закладке Advanced (Дополнительно) нужно указать в поле Message context
(Контекст сообщения) значение Set All (Установить все).
Узел MQOutput с именем MQOut Assessor посылает сообщение-запрос в очередь Assessor.
Это сообщение никогда не считывается и все время существует. Чтобы добиться
этого в рабочей системе, можно размещать сообщения с истекшим сроком действия
или, вместо того чтобы связывать выходной терминал узла с узлом AggregateRequest,
создать еще один узел MQInput для считывания сообщения. Вы можете указать сгене-
рированный msgid, чтобы удостовериться в том, что считывается нужное сообщение.
На закладке Advanced (Дополнительно) нужно указать в поле Message context
(Контекст сообщения) значение Set All (Установить все) и установить опцию New
Message ID (Новый ID сообщения).
(рис 9.79) Параметры на закладке Advanced (Дополнительно)
В узле AggregateRequest укажите в поле Folder Name (Имя папки) значение Flow4.
Это имя применяется в объединенном сообщении узла AggregateReply в качестве
имени папки для хранения ответа на запрос.
Чтобы сохранить запрос в таблице CLAIMSASSESSOR, нам нужно использовать вычислительный
узел Save AssessorRequest, а не узел Database Update, поскольку одно
из полей связано с папкой LocalEnvironment, а не с входным сообщением.
Укажите в поле Data Source (Источник данных) схему EMERGE и сгенерируйте
ESQL-модуль по умолчанию с именем Flow4_Save_AssessorRequest. Сам код ESQL мы
добавим позже.
Узел HttpRequest с именем SOAP/Http Assessors посылает запрос о готовности
каждому оценщику. Для узла принимаются параметры по умолчанию, за исключением
следующих:На закладке Basic (Общие):Укажите в поле Web service URL (URL Web-службы) значение http://SAH414A:7080/UNKNOWN.
Вообще URL оценщика задается в вычислительном узле.
Если используется данный URL, это означает ошибку. Мы можем
либо реализовать этот URL в брокере, либо просто оставить данное довольно
информативное значение, которое можно идентифицировать в журнале
событий как сообщение об ошибке SOAP.
Для тестирования укажите в поле Request Timeout (Тайм-аут запроса) значение 60 секунд.
Выберите вариант Follow Http redirection (Выполнять HTTP-перенаправление)
в поле Http Redirection Requests (Запросы перенаправления HTTP).
На закладке Advanced (Дополнительно) включите опцию Replace input message with web-service response (Замещать входное сообщение ответом Web-службы).
На закладке Default (По умолчанию) укажите свойства сообщения, как показано на рис 9.69.
На закладке Validation (Проверка) укажите в поле Validate (Проверять) значение Content and Value (Содержимое и значение).
Ответы-подтверждения от оценщиков можно связать для тестирования с трассировочным
узлом. В рабочей системе этот ответ можно отслеживать для измерения
доступности систем оценщиков.
Конфигурирование узла Data Delete с именем Delete claim status
Щелкните по узлу Delete claim status правой кнопкой мыши и в его свойствах укажите в поле Data Source (Источник данных) схему EMERGE.
Откройте редактор связей из панели свойств и выполните следующее:Выберите, как и в предыдущем разделе, SOAP envelope в поле Source (Источник).
Щелкните правой кнопкой мыши по полю Target (Цель) и выберите пункт Add
RDB Table Mapping Output (Добавить точку выхода для связи с таблицей реляционной БД).
Мы предполагаем, что вы выполнили инструкции, приведенные в разделе 9.5.3,
"Соединение базы данных с рабочим местом брокера". Согласитесь с пунктом
Add database table schemas from workspace (Добавить схемы таблиц базы
данных из рабочего пространства), нажмите Next (Далее), выберите таблицу
ASSESSOR_ASSESSOR_EMERGE_CLAIMASSESSOR и нажмите Finish (Готово).
Щелкните правой кнопкой мыши по полю Target (Цель), выберите пункт меню
Set RDB Schema name (Указать имя схемы РБД), установите переключатель
Use schema name in table definition (Использовать имя схемы в определении таблицы).
Соедините ClaimID в поле Source (Источник) с полем Target (Цель), чтобы указать,
что для удаления строки таблицы значение claimID должно совпадать.
Сохраните файл связей (рис 9.80).
(рис 9.80) Задание условия удаления для таблицы CLAIMASSESSOR
Поток Flow4a
Этот поток сообщений получает сообщение Flow4a от оценщика, проверяет его, посылает
подтверждение и вызывает поток Flow3a для выполнения агрегации (рис 9.81).
(рис 9.81) Поток Flow4aСоздайте следующие узлы:узел HttpInput для ожидания сообщения о готовности;
вычислительный узел Validate для проверки входного сообщения;
связующий узел Create Reply для связывания ответа с сообщением-ответом.
Перетащите потоки Reply, Fault и Flow3a в данный поток.
Сконфигурируйте узел HttpInput:На закладке Basic (Общие):Значение для поля URL selector (Селектор URL) предоставляется архитектором решения. Установите http://SAH414A:7080/AvailabilityReceive.
Для тестирования укажите в поле Maximum Client Wait time (Максимальное время ожидания клиента) значение 60 секунд.
На закладке Default (По умолчанию) укажите параметры набора сообщений так, как показано на рис 9.69.
На закладке Validation (Проверка) укажите в поле Validate (Проверять) значение Content and Value (Содержимое и значение).
Переименуйте сгенерированный ESQL-модуль для вычислительного узла Validate в Flow4a_Validate.
Сконфигурируйте трансформацию связей для возврата подтверждения оценщику так, как описано в разделе "Поток Flow3".
Совет. Вспомните, что мы связываем элемент AvailabilityResponse с возвращаемыми
элементами AvailabilityReponse, на которые ссылается сообщение soap11:envelope, так что
связи нужно устанавливать с сообщением soap11:envelope.
Поток Flow3a
Данный поток сообщений (рис 9.82) получает все корректные сообщения из потока
Flow4a и генерирует сообщение Flow3a, передаваемое в процесс ExternalClaimAssessors.
Это часть агрегации, относящаяся к объединению сообщений.
Здесь мы также используем базу данных 'CLAIMASSESSOR' в силу нескольких
причин:
Входящее сообщение не содержит URL оценщика, но для сообщения Flow3a URL оценщика необходим, поэтому мы извлекаем его, используя ключ ClaimID/AssessorID.
Сообщение Flow4a от оценщика не обязательно поступает из WebSphere MQ, поэтому нельзя предполагать, что оно содержит корреляционный ID (corellID), связанный с msgid исходного сообщения. При агрегации предполагается, что в corellID не содержится данное значение, поэтому поток извлекает исходный msgid из таблицы и передает его в узел AggregateReply как CorellID.
Для целей аудита сообщения записываются в базу данных CLAIMASSESSOR.
(рис 9.82) Поток Flow3aУзел MQInput Control получает контрольное сообщение агрегации из потока Flow3:На закладке Basic (Общие) укажите в поле Queue Name (Имя очереди) значение FLOW3A.CONTROL.
На закладке Default (По умолчанию) укажите в поле Message Domain (Домен сообщений) значение XML. Никакие другие свойства на этой закладке не требуются.
На закладке Advanced (Дополнительно) укажите в поле Transaction mode (Режим транзакций) значение No. Координация с другими сообщениями MQ не требуется.
На закладке Validation (Проверка) укажите в поле Validate (Проверять) значение Content and Value (Содержимое и значение).
Создайте узел TryCatch для предотвращения возврата ошибок в предыдущий сервисный поток.
Соедините подпоток ClientError с терминалами Catch и Failure узлов MQInput и с терминалом Catch узла TryCatch.
Создайте узел типа Database update с именем Update CLAIMASSESSOR. Этот узел заносит в базу данных CLAIMASSESSOR ответ каждого оценщика.
Создайте вычислительный узел Prepare Reply и сгенерируйте ESQL-модуль по умолчанию с именем Flow3a_Prepare_Reply. Он будет использоваться для подготовки сообщения WebSphere MQ к передаче в узел AggregateReply.
Создайте узел MQ Reply с именем MQReply AggIn, где AggIn – имя очереди.
Создайте узел MQ Input с именем MQInput AggIn, где AggIn – имя очереди. Настройте параметры по умолчанию для обращения к набору сообщений, как описано выше.
В узле AggregateReply укажите в поле Aggregate Name (Имя агрегата) то же имя, что и для узла AggregateControl, – proxyAssessorSystem. Укажите тот же период тайм-аута – 115 секунд. Это период, по истечении которого неопознанные ответы отбрасываются, если они приходят до контрольного сообщения. Отключите опцию Transaction Mode (Режим транзакции), поскольку мы не ограничиваемся сообщениями WebSphere MQ.
Создайте вычислительный узел Generate Output3a и сгенерируйте ESQL-модуль по умолчанию с именем Flow3a_Generate_Output3a для создания отправляемого сообщения Flow3a.
Создайте пустой поток Output3a и установите с ним связь.
Свяжите терминалы Unknown и Timeout узла AggregateReply с трассировочными узлами, сконфигурированными так же, как трассировочные узлы в потоке Fault, но используйте специфические номера ошибок, которые помогут в отладке. В реальном работающем потоке можно применять несколько более контролируемый способ перехвата данных условий.
Свяжите терминал Out узла Timeout с потоком Output3a, поскольку мы хотим пересылать незаполненные до конца наборы ответов.
Поток Output3a
Поток Output3a (рис 9.83) связывает систему proxyAssessorSystem с корпоративной
сервисной шиной компании LGI по протоколу SOAP/http и возвращает список готовых
оценщиков в процесс ExternalClaimAsessors.
(рис 9.83) Поток Output3aСконфигурируйте свойства узла HttpRequest следующим образом:на закладке Basic (Общие):укажите в поле Web service URL (URL Web-службы) ссылку на элемент Rece
iveAssessorAvailabilityList в процессе ExternalClaimAssessor:
http://SAH414B:9082/AssessorAvailabilityList;
для тестирования укажите в поле Request Timeout (Тайм-аут запросов)
значение 60 секунд;
выберите вариант Follow Http redirection (Выполнять HTTP-перенаправление)
в поле Http Redirection Requests (Запросы перенаправления HTTP);
оставьте без изменения параметры на закладках Advanced (Дополнительно)
и Error (Ошибка);
параметры на закладке Default (По умолчанию) установите так, как показано
на рис 9.69;
укажите на закладке Validation (Проверка) в поле Validate (Проверять) значение Content and Value (Содержимое и значение).
Для тестирования направьте ответ в журнал событий, как показано в потоке Flow4.
Поток Output3aAck
Поток Output3aAck для SOAP/Http-реализации корпоративной сервисной шины LGI
не нужен, поскольку подтверждение приходит на узел HttpRequest в потоке Output3a.
9.6.5 Создание потоков AssessorReport
На рис 9.84 показаны потоки, которые должны быть созданы для взаимодействий,
связанных с отчетами оценщиков (Assessor Report).
(рис 9.84) Потоки AssessorReportInput6
Поток Input6 (рис 9.85) получает запрос на отчет об оценке от процесса
ExternalClaimAssessor, передает управление в поток Flow6 для проверки и обработки
и обрабатывает любые ошибки, возвращая SOAP-ошибку. Используется та же схема,
что для потока Input3.
(рис 9.85) Поток Input6Сконфигурируйте узел Http Input следующим образом:
На закладке Basic (Общие) установите в поле URL Selector (Выбор URL) значение, предоставленное архитектором решения в файле AllocateAssessmentRequest(6). wsdl: http://SAH414A:9080/AllocateAssessmentRequest и значение тайм-аута 60 секунд.
На закладке Default (По умолчанию) укажите свойства набора сообщений так, как показано на рис 9.69.
На закладке Validation (Проверка) укажите в поле Validate (Проверять) значение Content and Value (Содержимое и значение).
Поток Flow6
Поток Flow6 (рис 9.86) проверяет запрос, полученный из потока Input6, перед
отправкой оценщику запроса на отчет об оценке. В потоке Flow6 используется та же
схема, что и в потоке Flow3.
(рис 9.86) Поток Flow6
Поток Flow7
Поток Flow7 (рис 9.87) посылает запрос отчета об оценке конкретному оценщику.
В таблице ACTIONASSESSOR для целей аудита хранится запись о запросах, в которую
в потоке flow8 заносятся ответы. URL оценщика устанавливается в вычислительном
узле set SOAP address. Код ESQL будет описываться ниже.
(рис 9.87) Поток Flow7Создайте следующие узлы:узел TryCatch для предотвращения возврата ошибок в предыдущий поток,
в данном случае поток flow6, а также создайте связанный с ним поток
ClientError для обработки ошибок;
узел Database Delete (Удаление из базы данных) для очистки устаревших записей в таблице ACTIONASSESSOR, указанных комбинацией ключей claimID/assessorID;
связующий узел (Mapping) с именем Map flow6 to flow7;
узел Database Insert (Вставка в базу данных) с именем Insert Audit trail into ACTIONASSESSOR;
вычислительный узел с именем set SOAP address;
узел HTTP Request с именем SOAP/Http Request;
трассировочный узел с именем Trace Reply 3058 для перехвата ответов.
На этот раз узел Database Delete очищает предыдущий экземпляр претензии, по-
сланной конкретному оценщику.Этот экземпляр узла Database Delete отличается от узла, описанного в разделе
"Конфигурирование узла DataDelete с именем Delete claim status", тем, что
существует два ключевых поля и их нужно объединить, чтобы выбрать правильный
набор строк.
Для этого нужно выполнить следующие действия:
Установите связь между сообщением ActionAssessor(6) и таблицей ACTIONASSESSOR, как показано на рис 9.88.
(рис 9.88) Связи для удаления претензии, направленной конкретному оценщику, в потоке Flow6
Щелкните по полям ASSESSORID и CLAIMID в представлении Outline (Общий обзор), удерживая клавишу Shift, чтобы выбрать оба столбца, и нажмите правую кнопку мыши (рис 9.89).
(рис 9.89) Выбор обоих полей для формирования связующего выражения
Выберите пункт меню ). Нажмите (рис 9.90) Изучение связующего выражения
Вы можете просмотреть выражение для удаления данных, выделив объединенную связь или одно из ее полей и щелкнув правой кнопкой мыши, выбрать пункт Edit Mapping (Редактировать связь). Нажмите OK (рис 9.91).
(рис 9.91) Редактирование выражения для удаления данных
Сгенерируйте ESQL-модуль по умолчанию для вычислительного узла Set SOAP address, назвав его Flow7_Set_SOAP_address.
Сконфигурируйте свойства узла HttpRequest следующим образом:закладка Basic (Общие):укажите в поле Web service URL (URL Web-службы) значение http://SAH414A:7080/UNKNOWN, как это делалось для потока Flow4;
для тестирования укажите в поле Request Timeout (Таймаут запроса) значение 60 секунд;
выберите вариант Follow Http redirection (Выполнять HTTP-перенаправление) в поле Http Redirection Requests (Запросы перенаправления HTTP).
оставьте без изменения параметры на закладках Advanced (Дополнительно) и Error (Ошибка);
параметры на закладке Default (По умолчанию) установите так, как показано на рис 9.69;
укажите на закладке Validation (Проверка) в поле Validate (Проверять) значение Content and Value (Содержимое и значение).
Связи, идущие от потока flow6 к потоку flow7, показаны на рис 9.92.
(рис 9.92) Связи от потока flow6 к потоку flow7
Вставка в базу данных показана на рис 9.93.
(рис 9.93) Вставка запроса отчета об оценке в таблицу ACTIONASSESSORВажно! Не забудьте объединить все связи в одной строке, иначе каждая связь будет вводиться
в таблицу как одна строка.Выделите все связи с помощью мыши, удерживая клавишу Shift, и выберите в меню правой
кнопки мыши пункт Combine to same row (Объединить в одну строку) > Remove selected
mappings (Удалить выбранные связи).
Для тестирования запишите ответ в журнал событий, как в потоке Flow4.
Поток Flow7a
Данный поток сообщений (рис 9.94) получает сообщение Flow7a от оценщика, который
был выбран для создания отчета об оценке, проверяет сообщение, отправляет
подтверждение и вызывает поток Flow6a, чтобы вернуть данные о согласии или отказе
оценщика в процесс ExternalClaimAssessors. Этот поток похож на поток Flow4a.
(рис 9.94) Поток Flow7aСоздайте следующие узлы:узел HttpInput для ожидания сообщения о готовности;
вычислительный узел Validate для проверки входного сообщения;
связующий узел Generate Reply для связывания ответа с сообщением-ответом.
Перетащите потоки Reply, Fault и Flow6a в данный поток.
Сконфигурируйте узел HttpInput:На закладке Basic (Общие) проделайте следующее:Значение для поля URL selector (Селектор URL) предоставляется архитектором решения. Установите http://SAH414A:7080/DeliverAssessmentRespons.
Для тестирования укажите в поле Maximum Client Wait time (Максимальное время ожидания клиента) значение 60 секунд.
На закладке Default (По умолчанию) укажите параметры набора сообщений так, как показано на рис 9.69.
На закладке Validation (Проверка) укажите в поле Validate (Проверять) значение Content and Value (Содержимое и значение).
Переименуйте сгенерированный ESQL-модуль для вычислительного узла Validate в Flow7a_Validate.
Сконфигурируйте связи для подтверждения так, как показано на рис 9.95.
(рис 9.95) Связи для сообщения-подтверждения для потока Flow7a
Поток Flow6a
Поток Flow6a (рис 9.96) форматирует ответ с согласием оценщика для вывода
потоком Output6a и сохраняет аудиторскую запись об ответе в таблице ACTIONASSESSORS.
(рис 9.96) Поток Flow6aСоздайте в потоке Flow6a следующие узлы:узел TryCatch и подпоток ClientError для изоляции возникающих здесь ошибок;
узел Database Update для хранения аудиторской записи;
связующий узел (Mapping), форматирующий сообщения для потока Output6a;
подпоток Output6a, возвращающий результаты в процесс ExternalClaimAssessor.
Создайте связи для обновления данных в таблице (рис 9.97).Выберите сообщение-источник и цель – таблицу базы данных ACTIONASSESSOR, как описывалось ранее. Не забудьте указать схему EMERGE базы данных. См. пример на рис 9.80.
Свяжите два поля и задайте одностороннюю связь типа CURRENT_TIMESTAMP, как показано на рис 9.97.
Объедините обновления в одну строку, используя щелчок мыши при нажатой клавише Shift, после чего выберите пункт меню Remove selected rows (Удалить выбранные строки). Будет выведена панель Combine Data Update Mappings (Комбинированные данные для связей обновления). Вам нужно вручную ввести условия обновления (конечно, это предложение SQL WHERE).
(рис 9.97) Конфигурация обновления базы данных в потоке Flow6aСовет. Одним из способов создания этого предложения и его вставки является создание узла
Data Delete и копирование условий удаления.
Создайте связи для вызова потока Output6a, как показано на рис 9.98.
(рис 9.98) Связи для потока flow6a
Поток Output6a
Поток Output6a (рис 9.99) связывает систему proxyAssessorSystem с корпоративной
сервисной шиной LGI при помощи протокола SOAP/http и передает список с данными
о готовности оценщиков в процесс ExternalClaimAssessor.
(рис 9.99) Поток Output6aСконфигурируйте свойства узла HttpRequest следующим образом:на закладке Basic (Общие) проделайте следующее:укажите в поле Web service URL (URL Web-службы) значение ссылки на ReceiveAssessorAvailabilityList в процессе ExternalClaimAssessor – http://SAH414B:9082/AssessorAvailabilityList ;
для тестирования укажите в поле Request Timeout (Тайм-аут запроса) значение 60 секунд;
выберите вариант Follow Http redirection (Выполнять HTTP-перенаправление) в поле Http Redirection Requests (Запросы перенаправления HTTP);
параметры на закладках Advanced (Дополнительно) и Error (Ошибка) оставьте без изменения;
на закладке Default (По умолчанию) укажите свойства сообщения, как показано на рис 9.69;
на закладке Validation (Проверка) укажите в поле Validate (Проверять) значение Content and Value (Содержимое и значение).
Для тестирования направляйте ответ в журнал событий, как в потоке Flow4.
Поток Output6aAck
Поток Output6aAck не нужен, поскольку мы используем SOAP/http и ответ
возвращается в узел Http Request потока Output6a.
Поток Flow8
Поток Flow8 (рис 9.100) получает отчет от выбранного оценщика и направляет его
в поток Flow9 (рис 9.102). Он напоминает поток Flow7a.
(рис 9.100) Поток Flow8Создайте следующие узлы:узел HttpInput для ожидания сообщения о готовности;
вычислительный узел Validate для проверки входного сообщения;
связующий узел Generate Reply для связывания ответа с сообщением-ответом.
Перетащите потоки Reply, Fault и Flow9 в данный поток.
Сконфигурируйте узел HttpInput:На закладке Basic (Общие) проделайте следующее:Значение для поля URL selector (Селектор URL) предоставляется архитектором решения. Установите http://SAH414A:7080/AssessorReport.
Для тестирования укажите в поле Maximum Client Wait time (Максимальное время ожидания клиента) значение 60 секунд.
На закладке Default (По умолчанию) укажите параметры набора сообщений так, как показано на рис 9.69.
На закладке Validation (Проверка) укажите в поле Validate (Проверять) значение Content and Value (Содержимое и значение).
Сконфигурируйте связующий узел Generate Reply так, как показано на рис 9.101.
(рис 9.101) Конфигурирование связей для подтверждения в потоке Flow8
Поток Flow9
Поток Flow9 (рис 9.102) готовит сообщение с отчетом оценщика к передаче на принимающую
партнерскую ссылку в процесс ExternalClaimAssessor. Он передает сообщение
в поток Output9 для помещения на сервисную шину LGI после обновления
своего аудиторского журнала.
(рис 9.102) Поток Flow9Создайте в потоке следующие узлы:узел TryCatch и подпоток ClientError для изоляции возникающих здесь ошибок;
узел Database Update с именем Update ActionAssessor table для хранения аудиторской записи;
связующий узел (Mapping), форматирующий сообщения для потока Output9;
подпоток Output9, возвращающий результаты в процесс ExternalClaimAssessor.
Создайте связи для обновления данных в таблице, как показано на рис 9.103, используя процедуру, аналогичную описанной для потока Flow6a.
(рис 9.103) Выражение обновления базы данных для потока Flow9
Создайте связи с сообщением, показанные на рис 9.104.
(рис 9.104) Связи с сообщением для потока Flow9
Поток Output9
Поток Output9 (рис 9.105) связывает систему proxyAssessorSystem с корпоративной
сервисной шиной LGI при помощи протокола SOAP/http и передает отчет оценщика
в процесс ExternalClaimAssessor.
(рис 9.105) Поток Output9Сконфигурируйте свойства узла HttpRequest следующим образом:на закладке Basic (Общие) проделайте следующее:укажите в поле Web service URL (URL Web-службы) значение ссылки на ReceiveAssessorAvailabilityList в процессе ExternalClaimAssessor – http://SAH414B:9082/assessorReport ;
для тестирования укажите в поле Request Timeout (Тайм-аут запроса) значение 60 секунд;
выберите вариант Follow Http redirection (Выполнять HTTP-перенаправление) в поле Http Redirection Requests (Запросы перенаправления HTTP);
параметры на закладках Advanced (Дополнительно) и Error (Ошибка) оставьте без изменения;
на закладке Default (По умолчанию) укажите свойства сообщения, как показано на рис 9.69;
на закладке Validation (Проверка) укажите в поле Validate (Проверять) значение Content and Value (Содержимое и значение).
Для тестирования направляйте ответ в журнал событий, как в потоке Flow4.
Поток Output9aAck
Поток Output9aAck не нужен, поскольку мы используем SOAP/http и ответ
возвращается в узел Http Request потока Output9.
9.7 Создание кода ESQL для потоков сообщений
Последний этап конфигурирования потоков сообщений в брокере – это написание
ESQL-кода для вычислительных узлов. Чтобы просмотреть все созданные нами для
потоков ESQL-модули, откройте свойства любого вычислительного узла и нажмите
кнопку Browse (Обзор) (рис 9.106).
(рис 9.106) Обзор ESQL-модулейНа рис. рис 9.107 показан список ESQL-модулей, необходимых для proxyAssessorSystem,
плюс модуль объявлений, common.esql.
(рис 9.107) ESQL-модули, которые необходимо написатьНам нужно написать 14 ESQL-модулей. Может показаться, что это очень много
кода, но этот код делится лишь на такие четыре категории, как:
Реализация агрегации SOAP/http, для которой 5-я версия брокера не имеет готовой поддержки (6 модулей).
Обработка ошибок. С помощью этого кода мы пытаемся ввести несколько больше диагностической информации в стандартные средства вывода данных об ошибках (6 модулей).
Конструирование SOAP-адреса для отправки запроса на отчет выбранному оценщику.
Повышение удобства чтения кода путем определения префиксов пространств имен в модуле common.esql.
На рис 9.108 приводятся 15 связующих узлов, которые выполняют большую
часть посреднических функций и манипуляций с данными и не требуют написания
ESQL-кода.
(рис 9.108) Связующие модули9.7.1 ESQL-функции, поддерживающие агрегацию
В табл. 9.10 перечислены семь ESQL-модулей, необходимых для конкретных потоков
сообщений.
ESQL-модули для конкретных потоков сообщений
| ESQL-модуль |
Описание |
| Flow4_PrepareMQ |
Преобразует входящее HTTP-сообщение в WebSphere MQ |
| Flow4_Fan_Out |
Конструирование сообщений-запросов к индивидуальным
оценщикам, создание и сохранение идентификатора ответа
и указание для каждого оценщика адреса SOAP/http |
| Flow4_PrepareMQControl |
Создание управляющего сообщения WebSphere MQ для отправки
в узел Aggregate Reply |
| Flow4_Save_Assessor_Request |
Сохранение сообщения-запроса, направляемого оценщику, в базе
данных CLAIMSASSESSOR |
| Flow3a_Prepare_Reply |
Корреляция данных о готовности оценщика с идентификатором
ответа и вставка в папку LocalEnvironment |
| Flow3a_Generate_Output3a |
Создание агрегированного ответа о готовности оценщиков для
отправки в процесс ExternalClaimAssessors |
| Flow7_Set_SOAP_Address |
Задание SOAP/http-адреса оценщика для отправки запроса на отчет
об оценке |
Flow4_PrepareMQ
В примере 9.9 входное сообщение копируется в выходную папку с удалением
HTTP-заголовков и заменой их новым MQMD.
CREATE COMPUTE MODULE Flow4_PrepareMQ
CREATE FUNCTION Main() RETURNS BOOLEAN
BEGIN
SET OutputRoot = InputRoot;
SET OutputRoot.HTTPInputHeader = null;
SET OutputRoot.HTTPResponseHeader = null;
CREATE NEXTSIBLING OF OutputRoot.Properties domain 'MQMD';
SET OutputRoot.MQMD.StrucId = MQMD_STRUC_ID; -- create MQMD
SET OutputRoot.MQMD.Version = MQMD_CURRENT_VERSION;
SET OutputRoot.MQMD.Format = ' ';
SET OutputRoot.MQMD.MsgType = MQMT_DATAGRAM;
RETURN TRUE;
END;
Flow4_Fan_Out
В примере 9.10 представлен ESQL-код
для модуля Flow4_Fan_out. Код имеет восемь частей.
Почти весь код (за исключением данных в SQL-инструкциях Insert и ссылках
LocalEnvironment) сгенерирован с помощью функции автозаполнения (Autocomplete),
так что этот код написать гораздо проще, чем кажется на первый взгляд.
Объявление локальных переменных.
Цикл while, в котором перебираются оценщики в списке оценщиков.
Копирование InputLocalEnvironment в OutputLocalEnvironment.
Задание пункта назначения SOAP/http в папке LocalEnvironment для динамического использования в узле HTTPRequest.
Копирование данных сообщения-запроса к оценщику из входного сообщения в выходное сообщение.
Передача сообщения для каждого оценщика и его папки LocalEnvironment далее по потоку сообщений.
CREATE COMPUTE MODULE Flow4_Fan_Out
CREATE FUNCTION Main() RETURNS BOOLEAN
BEGIN
DECLARE numberOfAssessors INTEGER CARDINALITY (InputRoot.MRM.soap11:Body.
fl3:requestAssessorAvailability.fl3:assessorList.fl3:assessors[]);
DECLARE assessorCount INTEGER 0;
WHILE assessorCount < numberOfAssessors DO
-- Эти инструкции должны быть в цикле, т.к. при передаче OutputRoot
очищается
CALL CopyMessageHeaders();
SET OutputLocalEnvironment = InputLocalEnvironment;
SET OutputRoot.MQMD.MsgType = MQMT_REQUEST;
SET OutputRoot.MQMD.ReplyToQ = 'AggIn';
SET OutputRoot.MQMD.Report = MQRO_COPY_MSG_ID_TO_CORREL_ID;
SET assessorCount = assessorCount + 1;
-- Адрес SOAP/Http для узла RequestHttp в качестве пункта назначения
SET OutputLocalEnvironment.Destination.HTTP.RequestURL = InputRoot.
MRM.soap11:Body.
fl3:requestAssessorAvailability.fl3:assessorList.fl3:assessors[assessorCount].
fl3:assessorURL;
-- Копирование данных сообщения из списка (f17 – синоним f14 – то же
пространство имен)
-- Выходные поля должны быть в том же порядке, что и элементы
SET OutputRoot.MRM.soap11:Body.fl7:requestAssessorAvailability.fl7:
claimID
= InputRoot.MRM.soap11:Body.fl3:requestAssessorAvailability.fl3:
claimID;
SET OutputRoot.MRM.soap11:Body.fl7:requestAssessorAvailability.fl7:
assessorID=
InputRoot.MRM.soap11:Body.fl3:requestAssessorAvailability.fl3:
assessorList.
fl3:assessors[assessorCount].fl3:assessorID;
SET OutputRoot.MRM.soap11:Body.fl7:requestAssessorAvailability.fl7:
cardet.
fl7:makeOfCar =
InputRoot.MRM.soap11:Body.fl3:requestAssessorAvailability.fl3:
makeOfCar;
SET OutputRoot.MRM.soap11:Body.fl7:requestAssessorAvailability.fl7:
cardet.
fl7:registration = 'JB 007'; -- Fixup as the registration wasn't
provided
SET OutputRoot.MRM.soap11:Body.fl7:requestAssessorAvailability.fl7:
location =
InputRoot.MRM.soap11:Body.fl3:requestAssessorAvailability.fl3:location;
SET OutputRoot.MRM.soap11:Body.fl7:requestAssessorAvailability.fl7:
reqDate =
InputRoot.MRM.soap11:Body.fl3:requestAssessorAvailability.fl3:
requiredDate;
SET OutputRoot.MRM.soap11:Body.fl7:requestAssessorAvailability.fl7:
responseTime=
InputRoot.MRM.soap11:Body.fl3:requestAssessorAvailability.fl3:
responseTime;
PROPAGATE;
END WHILE;
-- Все сообщения передаются явно, поэтому пустое сообщение не передается
RETURN FALSE;
END;
Flow4_Control_Message
Вычислительный узел Flow4_Control_Message передает выходное сообщение с терминала
Control узла Aggregate Control на узел MQOutput, который помещает его
в очередь, предназначенную для узла AggregateReply.
Все, что нам нужно сделать в этом модуле, – это создать сообщение WebSphere
MQ и передать ему сообщение, переданное от узла Aggregate Control в виде неструктурированного
XML-сообщения.
CREATE COMPUTE MODULE Flow4_PrepareMQControl
CREATE FUNCTION Main() RETURNS BOOLEAN
BEGIN
SET OutputRoot.MQMD.StrucId = MQMD_STRUC_ID;
SET OutputRoot.MQMD.Version = MQMD_CURRENT_VERSION;
SET OutputRoot.XML = InputRoot.XML;
RETURN TRUE;
END;
END MODULE;
Flow4_Save_AssessorRequest
После генерации сообщения-запроса мы сохраняем запрос к оценщику в базе данных
CLAIMASSESSOR, чтобы у нас было записанное узлом AggregateRequest значение
msgid. Обратите внимание, что мы сохраняем URL оценщика в Local Environment.
CREATE COMPUTE MODULE Flow4_Save_AssessorRequest
CREATE FUNCTION Main() RETURNS BOOLEAN
BEGIN
CALL CopyEntireMessage();
SET OutputLocalEnvironment = InputLocalEnvironment;
-- Сохраняем сообщение в таблице CLAIMASSESSOR
INSERT INTO Database.EMERGE.CLAIMASSESSOR (claimID, assessorID,
assessorURL,location, reqdate, makeofcar, registration, replytoq,
replytoqmgr,
correlid) VALUES (
InputRoot.MRM.soap11:Body.fl7:requestAssessorAvailability.fl7:
claimID,
InputRoot.MRM.soap11:Body.fl7:requestAssessorAvailability.fl7:
assessorID,
InputLocalEnvironment.Destination.HTTP.RequestURL,
InputRoot.MRM.soap11:Body.fl7:requestAssessorAvailability.fl7:
location,
InputRoot.MRM.soap11:Body.fl7:requestAssessorAvailability.fl7:
reqDate,
InputRoot.MRM.soap11:Body.fl7:requestAssessorAvailability.fl7:
cardet.fl7:makeOfCar,
InputRoot.MRM.soap11:Body.fl7:requestAssessorAvailability.fl7:
cardet.fl7:registration,
'NoReplytoQ',
'NoReplytoQmgr',
-- Сохранение корреляционного маркера из id сгенерированного сообщения
InputLocalEnvironment.WrittenDestination.MQ.DestinationData.msgId);
RETURN TRUE;
END;
Flow3a_Prepare_Reply
Узел Flow3a_Prepare_Reply получает ответы с информацией о готовности от оценщиков.
Его функция – извлечь для узла Aggregate Reply идентификатор ответа и создать
сообщение-запрос WebSphere MQ, которое будет послано узлу MQ Reply для возврата
реального сообщения-ответа с правильной корреляционной информацией. В
примере 9.13 приводится SQL-код, решающий эти задачи.
CREATE COMPUTE MODULE Flow3a_Prepare_Reply
CREATE FUNCTION Main() RETURNS BOOLEAN
BEGIN
SET OutputRoot = InputRoot;
SET OutputRoot.HTTPInputHeader = null;
SET OutputRoot.HTTPResponseHeader = null;
-- Создание MQ-сообщения-запроса – оно будет преобразовано в ответ в
MQReply
CREATE NEXTSIBLING OF OutputRoot.Properties domain 'MQMD';
SET OutputRoot.MQMD.StrucId = MQMD_STRUC_ID; -- create MQMD
SET OutputRoot.MQMD.Version = MQMD_CURRENT_VERSION;
SET OutputRoot.MQMD.Format = ' ';
SET OutputRoot.MQMD.Report = MQRO_COPY_MSG_ID_TO_CORREL_ID;
SET OutputRoot.MQMD.MsgType = MQMT_REPLY;
-- Тот же msgid как в сообщении-запросе, сохраненном в таблице Claim-
Assessor. MQReply скопирует его в correlid
SET OutputRoot.MQMD.MsgId =
THE (SELECT ITEM A.correlid FROM Database.EMERGE.CLAIMASSESSOR AS A
WHERE A.assessorID =
InputRoot.MRM.soap11:Body.fl8:assessorAvailability.fl8:assessorID
AND A.claimID =
InputRoot.MRM.soap11:Body.fl8:assessorAvailability.fl8:claimID);
SET OutputRoot.MQMD.ReplyToQ = 'AggIn';
RETURN TRUE;
Этот код очищает все HTTP-данные, создает MQMD и конфигурирует его как сообщение-запрос с исходным MsgId.
Flow3a_Generate_Output3a
Модуль Flow3a_Generate_Output3a создает результирующее сообщение Flow3a, включающее
список оценщиков, возвращаемый процессу ExternalClaimAssessor.
Объединенное сообщение сохраняется в массиве ComIbmAggregateReplyBody.
Flow4. По некоторым причинам нужно переустановить значение MessageSet в свойствах
(Properties). Значение то же, которое мы устанавливали для всех входных папок.
CREATE COMPUTE MODULE Flow3a_Generate_Output3a
CREATE FUNCTION Main() RETURNS BOOLEAN
BEGIN
-- Сколько ответов получено? Папка Flow4 определена в узле Aggregate
Request?
DECLARE noofreplies INTEGER
CARDINALITY(InputRoot.ComIbmAggregateReplyBody.Flow4[]);
DECLARE replyno INTEGER 1;
DECLARE assessorID INTEGER;
SET OutputRoot.Properties =
InputRoot.ComIbmAggregateReplyBody.Flow4.Properties;
SET OutputRoot.Properties.MessageSet = 'PIJ0MIK002001';
IF noofreplies > 0 THEN
SET OutputRoot.MRM.soap11:Body.fl3a:AvailableAssessorsList.claimID =
InputRoot.ComIbmAggregateReplyBody.Flow4[replyno].MRM.soap11:Body.fl8:
assessorAvailability.fl8:claimID;
WHILE noofreplies >= replyno DO
SET assessorID = InputRoot.ComIbmAggregateReplyBody.
Flow4[replyno].
MRM.soap11:Body.fl8:assessorAvailability.fl8:assessorID;
SET
OutputRoot.MRM.soap11:Body.fl3a:AvailableAssessorsList.resultAssessor-
Collection[
replyno].assessorEstimations.assessorID = assessorID;
-- assessorURL отсутствует в ответе, поэтому нужно брать его из базы
данных
SET
OutputRoot.MRM.soap11:Body.fl3a:AvailableAssessorsList.resultAssessor-
Collection[
replyno].assessorEstimations.assessorURL = THE (SELECT ITEM A.assessor
URL FROM
Database.EMERGE.CLAIMASSESSOR AS A WHERE A.assessorID = assessorID);
SET
OutputRoot.MRM.soap11:Body.fl3a:AvailableAssessorsList.resultAssessorCo
llection[replyno].assessorEstimations.preCost =
InputRoot.ComIbmAggregateReplyBody.Flow4[replyno].
MRM.soap11:Body.fl8:assessorAvailability.fl8:predCost;
SET
OutputRoot.MRM.soap11:Body.fl3a:AvailableAssessorsList.resultAssessorCo
llection[replyno].assessorEstimations.preDate =
InputRoot.ComIbmAggregateReplyBody.Flow4[replyno].
MRM.soap11:Body.fl8:assessorAvailability.fl8:predDate;
SET replyno = replyno + 1;
END WHILE;
RETURN TRUE;
ELSE
-- Не передавать сообщение, если ответов нет
RETURN FALSE;
END IF;
END;
9.7.2 Динамическая установка пункта назначения SOAP/Http
В примере 9.15 модуль Flow7_Set_SOAP_address задает пункт назначения SOAP/http
для использования узлом HTTPRequest при отправке запроса за оценку выбранному
оценщику. URL оценщика (assessorURL) находится во входном сообщении потока
Flow6, но он не копируется в сообщение Flow7, посылаемое оценщику, поэтому
ESQL-код получает его из входного сообщения потока Flow6.
CREATE COMPUTE MODULE Flow7_Set_SOAP_address
CREATE FUNCTION Main() RETURNS BOOLEAN
BEGIN
CALL CopyEntireMessage();
-- Нам нужно задать URL AllocateAssessmentRequest. Определен
--только URL AssessorAvailabilityRequest
-- Быстрое исправление состоит в наличии соглашения об именах...
SET OutputLocalEnvironment.Destination.HTTP.RequestURL =
REPLACE(InputRoot.MRM.soap11:Body.fl6:actionAssessor.fl6:assessor.
fl6:assessorURL,'Availability','DeliverAssessment');
RETURN TRUE;
END;
9.7.3 Объявления общих префиксов пространств имен
В табл. 9.11 приведен модуль пространств имен.
Модуль общих пространств имен
| ESQL-модуль |
Описание |
| common |
Объявление пространств имен и префиксов |
Хорошей практикой является указание укороченных префиксов для пространств
имен, используемых в коде ESQL. При этом инструкции становятся более короткими
и удобными для чтения. Пространства имен будут находиться в наборе сообщений
Assessor, который мы создали ранее. Если есть какие-то пропущенные или дублирующиеся
префиксы, сейчас можно изменить или добавить их. Одинаковым пространствам
имен нужно присваивать одинаковые префиксы. Мы соблюдали осторожность
при редактировании файлов схем, чтобы все они содержали разные префиксы перед
их преобразованием в наборы сообщений. Результаты можно увидеть на рис 9.109.
В навигаторе ресурсов выберите элемент Assessor Messageset $$\to$$ Assessor, выберите
файл messageSet.mset и перейдите на закладку XML1 в редакторе набора сообщений.
(рис 9.109) Добавление префикса к объявлению пространства именПримечание. Если используются схемы с одинаковыми пространствами имен, дублирующиеся
пространства имен и префиксы отбрасываются брокером сообщений.
Добавьте пространства имен и префиксы из каждого набора сообщений в модуль
common.eqsl, как показано в примере 9.16. Обратите внимание, что там, где у нас
пространства имен дублируются, мы не можем объявлять дублирующиеся префиксы.
BROKER SCHEMA proxyAssessorSystem
DECLARE soap11 NAMESPACE 'http://schemas.xmlsoap.org/soap/envelope/';
DECLARE fl3 NAMESPACE 'http://broker.lgi.itso.assessavail';
DECLARE fl3a NAMESPACE 'http://AssessorAvailabilityList.itso';
DECLARE fl7 NAMESPACE 'http://assessor.itso';
DECLARE fl8 NAMESPACE 'http://assbroker.lgi.itso';
DECLARE fl6 NAMESPACE 'http://broker.lgi.itso.allocreq';
DECLARE fl6a NAMESPACE 'http://AllocateAssessorResponse.lgi.itso';
-- DECLARE fl4a NAMESPACE 'http://assbroker.lgi.itso';
-- DECLARE fl7a NAMESPACE 'http://assbroker.lgi.itso';
-- DECLARE f4 NAMESPACE 'http://assbroker.itso';
-DECLARE fl9 NAMESPACE 'http://broker.lgi.itso.assessrept';
Совет. При изменении префиксов пространств имен или при редактировании файла common.
esql предупреждающие сообщения могут непредсказуемым образом попадать в список задач,
относящихся к нерешенным ссылкам на поля сообщений. Если перестройка всего рабочего
пространства не помогает избавиться от предупреждений, закройте рабочее пространство,
откройте его снова и опять полностью перестройте.
9.7.4 ESQL-код для обработки ошибок
В табл. 9.12 перечислены проверочные модули, которые нужно написать, и общий
обработчик ошибок. Проверочные модули мало отличаются друг от друга.
Проверочные ESQL-модули
| ESQL-модуль |
Описание |
| Flow3_Validate |
"Специфичная для потока" проверка входного сообщения |
| Flow4a_Validate |
| Flow6_Validate |
| Flow7a_Validate |
| Flow8_Validate |
| fault_identify_fault |
Общий обработчик SOAP-ошибок |
На примере модуля Flow3_Validate показана одна из этих процедур.
Flow3_Validate
Все проверочные процедуры строятся по одному образцу:
Настройка параметров вызова процедуры ValidateMessage в папке с глобальными
данными брокера Environment:SOAP-сообщение, которое ожидается в Environment.Message;
флаг, показывающий, что сообщение-исключение задается в этом модуле, а не в общем обработчике ошибок SOAP;
ссылки на папки, передаваемые процедуре ValidateMessage.
Вызов процедуры ValidateMessage и проверка возвращаемого флага.передача Inputroot на Outputroot, если проверка проходит успешно;
если проверка заканчивается неудачно, генерируется исключение со специфическими данными об ошибке, которое будет перехватываться входным узлом в начале потока и передаваться в общий обработчик ошибок.
Мы используем типичное сообщение об ошибке SOAP для хранения исключения,
поскольку не все WSDL, с которыми мы работаем, будут иметь интерфейс ошибок.
Ошибка должна возвращаться, только если Web-служба имеет интерфейс ошибок.
В примере 9.17 показан код для проверки в потоке Flow3.
CREATE COMPUTE MODULE Flow3_Validate
CREATE FUNCTION Main() RETURNS BOOLEAN
BEGIN
DECLARE xInputRoot REFERENCE TO InputRoot;
SET Environment.Message = 'requestAssessorAvailability';
-- В следующей инструкции регистрируется факт, что Web-служба генерирует
-- свое сообщение об исключении, а не использует ошибку SOAP по умолчанию
SET Environment.SOAP.Fault.FaultOption = 'CustomizedFault';
DECLARE xEnvironment REFERENCE TO Environment;
-- Проверка сообщения
CALL ValidateMessage(xInputRoot, xEnvironment);
IF Environment.SOAP.Fault.FaultCode = ' ' THEN
SET OutputRoot = InputRoot;
ELSE
-- Web-служба генерирует свое сообщение об ошибке... Это оно, и за
-- ним идет путь исключения
SET Environment.soap11:Body.Fault.faultstring =
'Flow3 input message validation failed... claimID ' ||
CAST(InputBody.soap11:Body.fl3:requestAssessorAvailability.fl3:
claimID AS
CHARACTER);
THROW USER EXCEPTION VALUES ('Flow3 Input validation failed');
END IF;
RETURN TRUE;
END;
Оставшаяся часть проверочных модулей
Скопируйте код из примера Flow3_Validate и внесите изменения, показанные
в табл. 9.13, в каждую из копий.
В каждой ESQL-реализации вычислительного узла Validate нужно изменить код,
помеченный выше жирным шрифтом.
Вставка переменных в процедуры проверки
| Поток |
Сообщение |
Поле ClaimID |
| Flow3 |
requestAssessorAvailability |
fl3:requestAssessorAvailability.fl3:claimID |
| Flow4a |
assessorAvailability |
fl4a:assessorAvailability.fl4a:claimID |
| Flow6 |
actionAssessor |
fl6:actionAssessor.fl6:claimID |
| Flow7a |
assessorResponse |
fl7a:assessorResponse.fl7a.claimID |
| Flow8 |
receiveAssessorReport |
fl8:receiveAssessorReport.fl8:claimID |
Fault_Identify_Fault
Модуль Fault_Identify_Fault (пример 9.18) предназначен для форматирования пакета
с данными об ошибке SOAP, содержащего полезные для диагностики сведения. Модуль
Main – это просто выход, если пакет уже создан. Выходные данные посылаются
узлу HttpReply для возврата SOAP-клиенту, в противном случае вызывается процедура
FaultProc, которая создает пакет с данными об ошибке.
CREATE FUNCTION Main() RETURNS BOOLEAN
BEGIN
IF Environment.SOAP.Fault.FaultCode = 'FaultReceived' THEN
-- Получена ошибка от другой Web-службы.... копируем данные на выход
SET OutputRoot = InputRoot;
ELSE
CALL FaultProc();
END IF;
RETURN TRUE;
END;
Процедура faultproc, приведенная в примере 9.19,
содержит восемь разделов. Она
компонует сведения об ошибке, в зависимости от того, какая информация об этой
ошибке доступна.
CREATE PROCEDURE FaultProc()
BEGIN
-- 1. Для Web-службы требуется типичное сообщение об ошибке SOAP
CALL CopyMessageHeaders();
SET OutputRoot.HTTPInputHeader = null;
SET OutputRoot.HTTPResponseHeader = null;
-- 2. Укажем подходящие значения для неопознанной ошибки в конфигура-
-- ционных данных службы
IF Environment.SOAP.Fault.FaultCode IS NULL OR
Environment.SOAP.Fault.FaultCode = ' '
THEN
SET Environment.SOAP.Fault.FaultActor ='proxyAssessorSystem';
SET Environment.SOAP.Fault.FaultCode = 'Server';
SET Environment.SOAP.Fault.FaultString = 'Server error in SOAP Web
service';
END IF;
-- 3. Создадим выходное сообщение об ошибке SOAP (MRM)
SET OutputRoot.Properties.MessageSet = 'Assessor';
SET OutputRoot.Properties.MessageType = 'Envelope';
SET OutputRoot.Properties.MessageFormat = 'XML1';
-- 4. Выводится MRM-сообщение. Добавим стандартный SOAP-конверт
-- Явно добавим пространство имен к значению кода ошибки
-- Поместим в данные об ошибке тело исходного сообщения (если возмож-
-- но... )
-- 5. Web-служба требует пользовательского сообщения об ошибке
IF Environment.SOAP.Fault.FaultOption = 'CustomizedFault' THEN
SET OutputRoot.MRM.soap11:Body.soap11:Fault.faultcode =
'soap11'||':'||
Environment.SOAP.Fault.FaultCode;
SET OutputRoot.MRM.soap11:Body.soap11:Fault.faultstring =
Environment.SOAP.Fault.FaultString;
SET OutputRoot.MRM.soap11:Body.soap11:Fault.faultactor =
Environment.SOAP.Fault.FaultActor;
SET OutputRoot.MRM.soap11:Body.soap11:Fault.detail =
Environment.soap11:Body;
ELSE
-- 6. Web-служба требует заданное по умолчанию сообщение об ошибке SOAP
SET OutputRoot.MRM.soap11:Body.soap11:Fault.faultcode = 'soap11'||':'||
Environment.SOAP.Fault.FaultCode;
SET OutputRoot.MRM.soap11:Body.soap11:Fault.faultstring =
Environment.SOAP.Fault.FaultString;
SET OutputRoot.MRM.soap11:Body.soap11:Fault.faultactor =
Environment.SOAP.Fault.FaultActor;
IF InputExceptionList.ParserException.ParserException.ParserException.
Number=5117
THEN
SET OutputRoot.MRM.soap11:Body.soap11:Fault.detail.OriginalBody =
'Input message is not valid XML';
ELSE
SET OutputRoot.MRM.soap11:Body.soap11:Fault.detail.OriginalBody =
InputRoot.*[<];
END IF;
-- 7. Проверяем, является ли список исключений результатом выполнения
-- ESQL THROW...
IF InputExceptionList.RecoverableException.RecoverableException.User-
Exception.Number = 2951 THEN
-- 8. Если нет, выводим список исключений в сообщение об ошибке SOAP
ELSE
SET OutputRoot.MRM.soap11:Body.soap11:Fault.detail.ExceptionList =
InputExceptionList;
END IF;
END IF;
END;
9.8 Размещение набора сообщений и потоков
Наша следующая задача – это размещение наборов сообщений и потоков для их
последующего тестирования, но сначала нам нужно реализовать URL: http://SAH414A:7080/UNKNOWN,
который был определен в потоках 4 и 7 как URL оценщика
по умолчанию на случай, если поток не сможет задать URL оценщика динамически.
Это одна из ситуаций из разряда "этого не должно случиться никогда", и поэтому мы
ля ее обработки используем тривиальный поток брокера.
9.8.1 Создание потока UNKNOWN
В проекте потока сообщений CommonSOAPHttpFlows создайте новый поток
сообщений UnknownAssessor (рис 9.110).
(рис 9.110) Поток UNKNOWNПеретащите в поток узел HttpInput и подпоток Fault и задайте свойства узла HttpInput
следующим образом:
Закладка Basic (Общие):в поле URL Selector (Выбор URL) укажите http://SAH414A:7080/UNKNOWN;
в поле Client Wait Time (Время ожидания клиента) укажите 30 секунд.
Закладка Default (По умолчанию):Message domain (Домен сообщений): MRM;
Message Set (Набор сообщений): Assessor;
Message Type (Тип сообщений): Envelope;
Message Format (Формат сообщений): XML1;
Закладка Validation (Проверка):Validate (Проверять): Content and Value (Содержимое и значение);
Failure Action (Действие при ошибке): Exception (Исключение).
9.8.2 Создание архива брокера
Чтобы разместить потоки и набор сообщений, нам нужно создать архив брокера
(Broker Archive, bar-файл) и указать, какие потоки и наборы сообщений будут в него
входить. Для простоты мы определили один .bar-файл, содержащий все, что нам нужно,
и разместили его в одной группе выполнения на одном брокере. Если бы нам, например,
захотелось разместить потоки Assessor Availability отдельно от потоков
Assessor Report, мы бы создали два архива брокера.
Переключитесь на перспективу Broker Administration (Администрирование брокера).
Щелкните правой кнопкой мыши по элементу Broker Archives (Архивы брокера), выберите пункт меню New (Новый) > Message Broker Archive (Архив брокера сообщений), присвойте новому файлу имя Assessor и нажмите Finish (Готово).
В редакторе .bar-файлов [панель . Нажмите Finish (Готово).
Нажмите Details (Подробно) в диалоговом окне, чтобы проверить наличие ошибок. Нажмите (рис 9.111) Создание файла Assessor.barПолучившийся архив выглядит так, как показано на рис 9.112. Обратите
внимание, что отображаются только потоки с входными (Input) узлами.
(рис 9.112) Файл Assessor.bar
Сохраните файл Assessor.bar.
Совет. Вы можете открыть .bar-файл с помощью инструмента для работы с .zip-файлами
и изучить его содержимое. Одной из полезных хитростей, о которой вам может сказать
специалист по брокеру, является то, что, если у вас возникают проблемы с SQL-кодом,
сгенерированным узлами для работы с базами данных в потоках сообщений, вам следует
изучать SQL-код в bar-файле, а не в формате .xmi в перспективе Development (Разработка)
рабочего места. Вы можете увидеть здесь то, что в действительности было размещено. Вы
также можете обнаружить, что SQL-код стало проще читать, поскольку некоторые
символические значения были решены. См. пример 9.20.
CREATE PROCEDURE Flow3a_DataUpdate (IN s_Envelope REFERENCE
{'http://schemas.xmlsoap.org/soap/envelope/'}:Envelope)
BEGIN
--$IBM_WBIMB_XMIID=UpdateStatement_1
UPDATE Database.EMERGE.CLAIMASSESSOR AS "T#"
--$IBM_WBIMB_XMIID=UpdateStatement_1#assignments
SET PREDCOST = s_Envelope.soap11:Body.fl8:assessorAvailability.fl8:
predCost,
PREDDATE = s_Envelope.soap11:Body.fl8:assessorAvailability.fl8:predDate
WHERE "T#".CLAIMID =
s_Envelope.soap11:Body.fl8:assessorAvailability.fl8:claimID AND
"T#".ASSESSORID =
s_Envelope.soap11:Body.fl8:assessorAvailability.fl8:assessorID ;
END;
Размещение файла Assessor.bar в брокере
Запустите сервер с брокером сообщений, если вы этого еще не сделали. Обратитесь
к разделу 7.2.5, "Инсталляция и конфигурирование брокера сообщений" и установите
соединение с брокером через инструментарий. Обратите внимание на раздел "Конфигурация инструментария".
В перспективе Broker Administration (Администрирование брокера) откройте
представление Domain (Домен) и щелкните правой кнопкой мыши по элементу WBRK_BROKER. Выберите пункт меню New (Новая) $$\to$$ Execution Group (Группа
выполнения), назовите группу выполнения Assessor и нажмите Finish (Готово)
(рис 9.113).
(рис 9.113) Создание группы выполнения Assessor
Перетащите файл Assessor.bar в новую группу выполнения. Изучите подробные
сведения в появившемся окне, нажмите OK.
Сделайте двойной щелчок мышью по журналу событий (Event log) в представлении
Domain (Домен). Изучите открывшийся журнал FMCQM (рис 9.114). При выборе
сообщения отображается его содержимое. Если вы точно следовали инструкциям,
ошибок быть не должно.
(рис 9.114) Проверка журнала событий
Обновите группу выполнения в представлении Domains (Домены). Результат показан
на рис 9.115.
(рис 9.115) Группа выполнения Assessor после размещения
9.9 Модульное тестирование размещенных потоков
Для тестирования размещенных потоков необходимы:
Инструмент тестирования для отправки и получения образцов SOAP-сообщений
Каркас системы для работы с оценщиками и претензиями. Можно использовать образец приложения для оценщиков, работающий на WebSphere Application Server.
Знание методов трассировки и отладки потоков WebSphere Business Integration Message Broker.
9.9.1 Инструменты для тестирования
Существует несколько клиентских SOAP-инструментов для тестирования. Наиболее
доступным и универсальным является Web services Explorer (рис 9.116), входящий
в пакеты WebSphere Studio Application Development Integration Edition и Rational Software
Architect. Этот инструмент позволяет загрузить WSDL-файл и изменять его части,
например адрес Web-службы. В него входят представления Form (Форма) и Trace
(Трассировка) для просмотра содержимого сообщений-запросов и ответов. Обе эти
рабочие среды содержат также TCP-монитор, с помощью которого можно увидеть,
какие данные реально передаются.
(рис 9.116) Использование Web services Explorer для тестирования WebSphere Business Integration Message Broker
9.9.2 Каркас системы оценщика и системы для работы с претензиями
Создать каркас системы оценщика и системы для работы с претензиями для тестирования
системы proxyAssessorSystem очень легко. Одна из сложностей, связанных
с системой оценщика, состоит в том, что она работает асинхронно и возвращает два
сообщения в ответ на запрос к выбранному оценщику. Сложно запрограммировать
в EJB определенные и неопределенные задержки.
Альтернативой является создание потока сообщений в брокере и имитация задержки
путем помещения сообщений WebSphere MQ в приостановленные очереди
с освобождением сообщений только по требованию (флаг Get Inhibit).
На рис 9.117 показан базовый каркас системы готовности оценщика. Этот поток
посылает HTTP-ответ, а затем отправляет сообщение о готовности оценщика. Узлы
Mapping позволяют легко сформировать правильное содержимое сообщений. Трассировочные
узлы дают возможность отлаживать и проверять решение.
(рис 9.117) Поток базового каркаса для системы отправки данных о готовности оценщикаНа рис 9.118 показан базовый каркас системы отправки отчета оценщика. Структура
практически аналогична предыдущей, но на этот раз после ответа выполняются
два потока, которые посылают подтверждение, а затем сам отчет. Запросы помещаются
в очереди WebSphere MQ. Два других потока принимают запросы из очередей,
когда флаг Get Inhibit сбрасывается при помощи инструмента MQ Explorer, а затем
генерируют HTTP-запросы, посылаемые в систему proxyAssessorSystem.
(рис 9.118) Поток базового каркаса для системы отправки отчетов оценщика
9.9.3 Потоки трассировки и отладки
Существует три основных метода отладки потоков WebSphere Business Integration
Message Broker: использование трассировки, использование трассировочных узлов
и отладчик в рабочей среде.
Одной из лучших функциональностей WebSphere Business Integration Message
Broker является возможность отладки. Соответствующие инструменты помогают визуализировать
все данные, проходящие от угла к узлу, и, если вы захотите, вы можете
с помощью средств трассировки получить полную распечатку функционирования
потоков, можете использовать трассировочные узлы для регистрации части операций
или можете с помощью отладчика пошагово проходить разделы потока или
SQL-кода с интерактивной модификацией данных в ходе выполнения.
Трассировка
Управление трассировкой осуществляется из командной строки, и она работает на
уровне групп выполнения. Вы можете изменить уровень трассировки и трассировать
отдельные потоки, для чего нужно установить опции в представлении Domains (Домены)
рабочей среды.
Приведенные ниже пять скриптов помогут быстро выполнить трассировку.
Скрипт ClearAtrace (пример 9.21) и скрипт GetAtrace
(пример 9.22) работают
с интерфейсами брокера. Уровень трассировки, установленный, например, с помощью
средств рабочей среды, остается без изменений. Скрипты ClearTraces и GetTraces
(примеры 9.23 и 9.24)
содержат списки исследуемых групп выполнения, а скрипт (пример 9.25)
сводит все эти скрипты в одну команду, запускаемую каждый раз, когда
нужно выполнить трассировку.
@rem очистка трассировочного журнала
@SETLOCAL
@rem первый аргумент – имя брокера, а второй – группа выполнения
@mqsichangetrace %1 -u -e %2 -r
@echo Tracing options for execution group %2 running on broker %1
@mqsireporttrace %1 -u -e %2
@ENDLOCAL
@rem Получение данных в трассировочный журнал
@SETLOCAL
@rem первый аргумент – имя брокера, а второй – группа выполнения
@mqsireadlog %1 -u -e %2 -o %2.xml
@mqsiformatlog -i %2.xml -o %2.txt
@start notepad %2.txt
@ENDLOCAL
@SETLOCAL
@Call ClearAtrace WBRK_BROKER LGIAvailability
@Call ClearAtrace WBRK_BROKER LGIReport
@Call ClearAtrace WBRK_BROKER Assessor
@ENDLOCAL
@SETLOCAL
@Call GetAtrace WBRK_BROKER LGIAvailability
@Call GetAtrace WBRK_BROKER LGIReport
@Call GetAtrace WBRK_BROKER Assessor
@Call ClearTraces
@ENDLOCAL
@SETLOCAL
@Call GetTraces
@Call ClearTraces
@ENDLOCAL
Трассировочные узлы
Трассировочные узлы (
) можно вставлять в любое место потока или
присоединять параллельно к другому выходному коннектору.
На рис 9.119 показан типичный трассировочный узел. Он сконфигурирован на
вывод в журнал событий Windows события, которое выглядит как Error 3096 и содержит
информацию из дерева сообщений, локального окружения (LocalEnvironment),
списка исключений и окружения (Environment). Не имеет никакого значения, если
какие-то данные в период выполнения оказываются пустыми. Используйте SQL-выражения
для формирования выводимых данных, ведь для отладки большой объем дампа
весьма полезен.
(рис 9.119) Типичный трассировочный узелНомер сообщения (Message number) выбирается из предустановленного каталога
из зарезервированного диапазона (3051-3099), и для него существует заранее заданное
сообщение. Можно определять дополнительные каталоги и сообщения, но для
отладки имеющийся каталог сообщений вполне подходит.
Обычной процедурой является вызов консоли управления Windows (Windows
Management Console) и просмотр журнала приложений. Очистите журнал перед
запуском трассировки, и, если вы правильно выбрали номера сообщений, процесс
выполнения можно легко проследить по трассировочным событиям, появляющимся
в журнале.
Отладка
Последней технологией, которую мы опишем, является традиционная пошаговая отладка.
Откройте перспективу Flow Debug (Отладка потока), которая отображается в виде
красного жучка (
). Диалоговое окно
поможет вам подключиться к брокеру, а затем – к одной или нескольким группам выполнения,
а также расставить точки останова. Обратите внимание, что кнопка, на которую нужно нажимать,
чтобы выполнить шаг в ESQL-коде, отличается от кнопки, которую нужно нажать, чтобы выполнить шаг
в потоке сообщений, и ее часто не замечают (рис 9.120).
(рис 9.120) Точка останова в потоке сообщений с возможностью трассировки ESQLВ окнах переменных отображаются значения переменных при прохождении ESQL-кода
в вычислительном узле. Если в вашем потоке нет кода ESQL, отладчик будет
не слишком полезен. В окне переменных есть специальная папка Debug Message,
в которой отображаются все доступные в потоке данные (рис 9.121).
(рис 9.121) Debug MessageВ окнах переменных отображаются значения переменных при прохождении ESQL-кода
в вычислительном узле. Если в вашем потоке нет кода ESQL, отладчик будет
не слишком полезен. В окне переменных есть специальная папка Debug Message,
в которой отображаются все доступные в потоке данные (рис 9.121).