В этой статье я расскажу как реализовать заглушки веб-сервисов бизнес-процесса на BPEL используя Oracle SOA Suite и сервер Weblogic Есть проект по нагрузочному тестированию одной системы. В схеме взаимодействия между серверами есть внешние системы, которые не участвуют в объекте тестирования — надо их заменить эмуляторами или заглушками. Протокол SOAP. Композиты на BPEL. Стенда нет. Ужасно интересно! 
 Ну, думаю, все просто. Запрошу WSDL, XSD-схемы, примеры запросов и ответов. Возьму любимый Eclipse, Tomcat, быстро сгенерирую классы, вставлю пример ответа, потом деплой и проверка. Eclipse сильно возмущался: в WSDL нет необходимой информации для нормальной генерации классов. Я стал его править, прописывать endpoint, но все равно не работало. Затем выяснил что это BPEL-процесс, и его надо делать по другому.  Сам BPEL — язык на основе XML для формального описания бизнес-процессов и протоколов их взаимодействия между собой. И Eclipse все это умеет, есть плагины, есть сервер приложений Apache ODE. Похоже, что проект BPEL-процесса в Eclipse надо собирать вручную, тех файлов что есть в композите, он не создает. Импорт выгруженного композита из функционального стенда тоже не работает. Это было удивительно, если бы он импортировал композит из Weblogic в Eclipse. Посетила мысль сделать точно также, как на продуктиве: Oracle Database + Oracle Weblogic + Oracle SOA Suite, разработка в Oracle JDeveloper. Далее я расскажу про: BPEL — язык на основе XML для формального описания бизнес-процессов и протоколов их взаимодействия между собой.  Надо сказать, что BPEL довольно большая и удобная штука, позволяющая вставлять разные операторы, дебаг и куски кода, например Java. Бизнес процесс выглядит примерно так: 
 Давайте развернем свой стенд. И так, что нам потребуется и какие версии:  Инструкции по установке и настройке софта Запуск установщика. Выбор пути для домашней папки.


 Пропустим регистрацию для обновлений.


 Выберем типичную установку.


 Укажем папку с JDK.


 Далее укажем папку куда поставить сам Weblogic.


 Установка и поздравления. В установке нет ничего сложного, остановлюсь только на некоторых моментах.
Пропустим минимальные требования и поставим Oracle Database 11g Release 2 x32 для Windows, выберем Desktop Class. Нам для разработки хватит.
В интернете, в том числе и на хабре есть много статей по установке. Отмечу только установку под локальным админом и задание переменных окружения. Хотя ошибка с отсутствием ORACLE_UNQNAME не помешала и все завелось.  Для запуска установщика надо указать путь к JRE или JDK. Пропустим обновление софта.


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


 Выбор Middleware Home и название директории для нашего SOA.


 Далее установщик нашел Weblogic в домашней папке.


 Установка и поздравления. Проверим подключение. Или запустим SQL Developer и настроим подключение. Запустим RCU. Выбираем Create Repository.


 Указываем параметры БД, в нашем случае это localhost, 1521, sys и пароль. Далее идет проверка. Следом надо указать префикс для имен схем данных (по умолчанию DEV) и выбрать компоненты репозитория, нам нужны Metadata Services и SOA Infrastructure, User Messaging Service выбирается автоматически.


 Укажем пароль для пользователей, владельцев схем с данными для репозитория.


 Потом можно выбрать табличные пространства для схем данных репозитория.


 Запуск создания tablespaces.


 Готово.


 Запускаем установку.
Чтобы его создать запустим файл config.cmd в папке У меня JDK 1.7, поэтому он ругнулся


Мы ее обойдем — меняем javaw на java в файле  и получаем описание Unrecognized VM option 'UseSpinning'
Удаляем опцию -XX:+UseSpinning (которой больше нет с 1.6) в файле и снова запускаем. Выбираем создание нового домена.


 Выбираем Oracle SOA Suite, Enterprise Manager. WSM Policy Manager и JRF выберутся автоматически.


 Указываем имя и путь к домену и приложениям.


 Пароль для пользователя weblogic.


 JDK и тип инсталляции. Оставим Development Mode.


 Пропишем пароли к вашим схемам, хост и sid:.


 Проверка.


 Настраивать не будем, оставим пустыми.


 Жмем создать. Готово. Запустим Admin Server.


 Дождемся сообщения "Server state changed to RUNNING" Запустим soa_server1. Когда будет просить ввод логина и пароля, вводим от администратора домена. Чтобы больше не просил создадим файл. Проверка WebLogic Administration Console: http://localhost:7001/console (если вы использовали порт по умолчанию при установке).


 Проверка Enterprise Manager: http://localhost:7001/em
В Enterprise Manager должна быть доступна вкладка “SOA” в дереве слева. 
 Необходимо установить JDeveloper что бы создавать композиты. Берем версию 11.1.1.9.0.
Ставим, используя существующий Middleware Home. Для работы с композитами, необходимо установить расширение для нашего JDeveloper.






 Композиты, которые мы будем деплоить, используют схемы, которые хранятся в MDS в БД. Его можно запросить или выкачать из стенда для функционального тестирования. Импорт MDS архива.




 Создание подключения к БД под пользователем схемы MDS. View->Resource palette->New Connection->Database


 Создание подключения к MDS. View->Resource palette->New Connection->SOA-MDS


 Создание пустого проекта. (File->New).






 Импорт существующего композита. Композиты также можно выкачать с функционального стенда. Выбираем созданный проект, File->Import.






 Расковыряем композит и задеплоим На картинке выше можно видеть в правой части имеется внешняя система и бизнес-процесс ее вызывает методом invoke.
Давайте же уберем это ненужное. Я буду делать это в блокноте. Но можно и в интерфейсе. 
 Краткий экскурс.
Файл состоит из блоков, вариаций больше, я перечислю некоторые:
process — корневой тег для процесса
partnerLinks — партнерские соглашения между сервисами
variables — декларация переменные
faultHandlers — обработчики ошибок
sequence main — бизнес-процесс
receive — получение запроса от клиента
assign — блок присвоения переменных
сopy — копирование данных из одного объекта в другой
invoke — вызов веб-сервиса
if, elseif, else — объявление условий
condition — описание условия
forEach — объявление цикла
startCounterValue — начало цикла
finalCounterValue — конец цикла
scope — объединение Убрать часть соглашения, касающееся внешней системы. Для простоты обработчик ошибок я тоже удалю. Весь тег faultHandlers. Удаляем assign запроса к внешней системе, оставим только копирование данных из запроса для идентификации запроса. Удаляем все вызовы внешних систем invoke, кроме последнего в файле, где должен быть ответ нашему клиенту. Посмотрим переменную, в которую нужно записать ответ. В нашем случае это outputVariable Берем пример ответа, который наш дружелюбно предоставили разработчики или мы сами вытащили из SOA на функциональном стенде. И прописываем значения в нужные теги. Например
Метод payload, операция ответа AnsSearchGetCustomerPartyAcc и xpath поставим свои.
BEGIN[$itr] — элемент в цикле, означает $itr-итый элемент BEGIN внутри родительского. Пробуем задеплоить.


 Выбор операции.


 Можно создать несколько сервисов с одинаковым именем, но разной версии.
Вызывать можно все, но по стандартному адресу будет работать только default-ревизии. В Enterprise Manager можно применить default на задеплоенном композите.


 Выбор сервера.


 Добавим локальный сервер. Жмем плюс.




 Выбор SOA сервера.


 Summary.


 Лог деплоя.


 Несколько примеров интересных возможностей. Регулярные выражения. Присвоение строки  Цикл и итератор. Использование итератора в цикле.  Много встроенный функций, например генерация guid. Или сравнение. Вкусное. Можно вставить Java. Есть бизнес-процесс который вызывает внешнюю систему, которая через какое-то время делает запрос в тестируемую систему. Этого в нашем бизнес-процессе нет.
Необходимо настроить партнерские соглашения с новым сервисом, прописать переменные и вставить invoke сервиса запросом ReqSyncFinancialTransactionBatch в наш бизнес-процесс.
Сервис-провайдер, который принимает запрос ReqSyncFinancialTransactionBatch тоже построен на SOA и по хорошему стечению обстоятельств от него есть композит.
Нужно его распаковать и перетащить все, что относится к вызову провайдера в наш композит. Добавляем пространства имен от провайдера и типа запроса в список. Добавление партнерского соглашения. Мне потребовалось еще и импортировать схемы. Пропишем переменные. Делаем присвоения в новом запросе, там где необходимо в соответствии со схемой. Присвоение переменной во входную переменную для вызова сервиса. Смотрим в wsdl провайдера на сообщение, которое он понимает. Делаем вызов сервиса invoke, и вычитывание ответа receive, если нужно.
Если нужно, проставляем необходимые хедеры к запросу с помощью bpelx:toProperties. Добавим отношение к новому сервису в файл .componentType Положим wsdl PROVIDER_TAWrapper.wsdl от сервиса в наш проект Добавим reference в файл сfgplan Добавим импорт wsdl, reference и wire в файл composit.xml
Обратим внимание на ссылку к wsdl сервиса-провайдера location="http://k10systwp.mybank.ru:7030/webproxy/WS/PROVIDER_TA?wsdl Проверим то, что мы наделали. Что делать если разработчики скажут, что наша заглушка тормозит, а у них все отлично?
Будем разбираться. Потребовалось найти запросы по содержимому, чтобы понять что с ним случилось. Таблица CUBE_INSTANCE в нашей схеме DEV_SOAINFRA содержит всю историю по композитам. Но для просмотра надо ее вытащить из блоба.
Нашел тут функцию, которая это делает  и пример использования Картинки кликабельны. Тут ничего сложного Размер табличного пространства можно смотреть в таблице dba_tablespace_usage_metrics За неизвестное можно и нужно браться и не бояться ошибиться. Да, и JDev мне понравился больше чем Eclipse. Ссылки на источники: Нагрузочное тестирование