Разработка заглушек бизнес-процесса на языке BPEL на основе Oracle SOA Suite и Weblogic

В этой статье я расскажу как реализовать заглушки веб-сервисов бизнес-процесса на BPEL используя Oracle SOA Suite и сервер Weblogic


Задача


Есть проект по нагрузочному тестированию одной системы. В схеме взаимодействия между серверами есть внешние системы, которые не участвуют в объекте тестирования — надо их заменить эмуляторами или заглушками. Протокол SOAP. Композиты на BPEL. Стенда нет. Ужасно интересно!


ae6b61c803164129907b8d53846684be.jpg


Решение


Ну, думаю, все просто. Запрошу 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.


Далее я расскажу про:


  • Разворачивание своего стенда
  • Подключение MDS
  • Импорт существующего композита
  • Выпиливание вызова внешних систем
  • Вставку примера успешного ответа
  • Примеры использования операторов
  • Добавление в композит нового веб-сервиса
  • Вызов асинхронного сервиса
  • Деплой композита
  • Проверку модифицированного композита
  • Анализ проблем при проведении тестирования
  • Мониторинг и замечания при работе

BPEL — язык на основе XML для формального описания бизнес-процессов и протоколов их взаимодействия между собой.


Надо сказать, что BPEL довольно большая и удобная штука, позволяющая вставлять разные операторы, дебаг и куски кода, например Java.


Бизнес процесс выглядит примерно так:


63dda5acbd93458bbf49726319e7a36d.png


Весь бизнес-процесс строится в виде композита и устанавливается на сервер-приложений. Запросил рабочий композит с функционального стенда, настроил Eclipse для работы с BPEL (плагины, Apache ODE и прочее). Снова попытки импорта композита в Eclipse. Снова неудача.


Посетила мысль сделать точно также, как на продуктиве, итого мы имеем в хозяйстве: Oracle Database, Oracle Weblogic, Oracle SOA Suite, JDeveloper. И так, что нам потребуется и какие версии:


  • JDK 1.7.79
  • Oracle Database 11g release 2
  • Oracle SOA Suite 11.1.1.7.0
  • Oracle RCU 11.1.1.7.0
  • Weblogic 10.3.6
  • JDeveloper 11.1.1.7.0
  • Готовые композиты бизнес-процессов
  • Архив MDS
  • Примеры запросов и ответов

Разворачивание своего стенда


Инструкции по установке и настройке софта


Установка Weblogic
  1. Запуск установщика.


    java -jar wls1036_generic.jar

  2. Выбор пути для домашней папки.

    17f8a90a7c7a4bbe90b425497daf8392.png


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

    ce3d43cb2cac46628111fa33e4207d5c.png


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

    0b9f8e72764f4a36b8e2ccff55b229e9.png


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

    dd22efea2dd04e3685168321fabe2dc3.png


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

    cff5981a3763459587a7c322d2677d66.png


  7. Установка и поздравления.

Установка Oracle

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


c31138f3a4a644eb8db97844d322b2de.png


Установка SOA Suite
  1. Для запуска установщика надо указать путь к JRE или JDK.


    ofm_soa_generic_11.1.1.7.0/Disk1/setup.exe -jreLoc c:\Oracle\Middleware\jdk160_24

  2. Пропустим обновление софта.

    5295cb5b1f8e468bb590c3d94d96a4c2.png


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

    f1c6a40cd25b4a05b0b01fc93e2127d5.png


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

    027fabcea41946208f8def576cab33fe.png


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

    7cf3f790b49340ffa375ab5569fde407.png


  6. Установка и поздравления. Проверим подключение.
    sqlplus sys@ORCL as sysdba
  7. Или запустим SQL Developer и настроим подключение.
    c:\app\admin\product\11.2.0\dbhome_1\sqldeveloper\sqldeveloper.exe

Создание репозитория для Oracle SOA c помощью RCU
  1. Запустим RCU.


    ofm_rcu_win_11.1.1.7.0_64_disk1_1of1/rcuHome/bin/rcu.bat

  2. Выбираем Create Repository.

    a046e8c0f32c4f8dafb80e150c50ccd3.png


  3. Указываем параметры БД, в нашем случае это localhost, 1521, sys и пароль. Далее идет проверка.


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

    f8a959d04c194ae8a2dadef632e84f99.png


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

    367e272aa2574e7c8d43048cbfd6a78d.png


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

    621e3a0210804e47beac93868d7daae9.png


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

    46c11590d80d4042997ee3a0f63411a8.png


  8. Готово.

    90a25e783c6a4716a7c0c5b21aad49b7.png


Создание WebLogic домена и запуск серверов
  1. Запускаем установку.
    Чтобы его создать запустим файл config.cmd в папке


    C:\Oracle\Middleware\Oracle_SOA1\common\bin

    У меня JDK 1.7, поэтому он ругнулся

    016673dfd4de49ecb6c37caea33313ea.png
    Мы ее обойдем — меняем javaw на java в файле


    c:\Oracle\Middleware\wlserver_10.3\common\bin\config.cmd

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


    c:\Oracle\Middleware\wlserver_10.3\common\bin\commEnv.cmd

    и снова запускаем.


  2. Выбираем создание нового домена.

    b73a70dd4cc74b63b039a4073e7c4259.png


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

    05815c5bfc314e69acb8af9bad1c6c96.png


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

    1793b5caf20f45b0a90f3027f16f112a.png


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

    bbfac9fecee94f1084e2435437fa7b15.png


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

    9f6bbce58e81475484f53a9ec53824b6.png


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

    443a39f543b249cebfa8a92940eeeb95.png


  8. Проверка.

    7a2de61371b44f9fa4522b885f1e9a3b.png


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

    00b4615207424035b6d04b7194304fcd.png


  10. Жмем создать.


  11. Готово. Запустим Admin Server.

    7e81ab77ef6d4c8cb81df9d8f74cfea2.png


  12. Дождемся сообщения «Server state changed to RUNNING»


  13. Запустим soa_server1.
    c:\Oracle\Middleware\user_projects\domains\base_domain\bin\startManagedWebLogic.cmd soa_server1
  14. Когда будет просить ввод логина и пароля, вводим от администратора домена. Чтобы больше не просил создадим файл.
    c:\Oracle\Middleware\user_projects\domains\base_domain\servers\soa_server1\security\boot.properties


    username=weblogic
    password=welcome1

Проверка консолей и настройка JDeveloper
  1. Проверка WebLogic Administration Console: http://localhost:7001/console (если вы использовали порт по умолчанию при установке).

    af078d1e38c2433191fbe79fb4dd4142.png


  2. Проверка Enterprise Manager: http://localhost:7001/em
    В Enterprise Manager должна быть доступна вкладка «SOA» в дереве слева.

d8f35ca4907c4fb286c56bbc03477e3b.png


  1. Необходимо установить JDeveloper что бы создавать композиты. Берем версию 11.1.1.9.0.
    Ставим, используя существующий Middleware Home.


  2. Для работы с композитами, необходимо установить расширение для нашего JDeveloper.

    3e799f1af66b48109e92208a89731de9.png

    ee5405f0741b42a6b740896e1b00d356.png

    f22a717be257481baf9dbba30f911c7b.png


Подготовка к разработке


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


Подключение к MDS и импорт архива
  1. Импорт MDS архива.

    72f8d376093e41ef9e771695aa128ef1.png

    4f7a660ebb6c47aa832ab80a954c434e.png


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

    23fdb2c921a643b881a26562141ece00.png

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

    b999820f8b4848d1bef0e2d54d838884.png


Импорт существующего композита
  1. Создание пустого проекта. (File→New).

    45e0b3b215e448599a3c8b6057b6415a.png

    5b7a1c716ae844ccb23d573b3d8a4764.png

    c17fb73bc1824c4395abe9ff8ec8d8d4.png


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

    c4b357b2333c4428a9e415e63b0b3f04.png

    8121359e832f4b1db4fd6ef2a33e9901.png

    5b2becff230345a1a7822eab1132827f.png


Разработка


Расковыряем композит и задеплоим


Выпиливание вызовов внешних систем. Редактирование BPEL-файла

На картинке выше можно видеть в правой части имеется внешняя система и бизнес-процесс ее вызывает методом invoke.
Давайте же уберем это ненужное. Я буду делать это в блокноте. Но можно и в интерфейсе.


93178a7f6f2e430e9c2c324116e536a6.png


  1. Краткий экскурс.
    Файл состоит из блоков, вариаций больше, я перечислю некоторые:
    process — корневой тег для процесса
    partnerLinks — партнерские соглашения между сервисами
    variables — декларация переменные
    faultHandlers — обработчики ошибок
    sequence main — бизнес-процесс
    receive — получение запроса от клиента
    assign — блок присвоения переменных
    сopy — копирование данных из одного объекта в другой
    invoke — вызов веб-сервиса
    if, elseif, else — объявление условий
    condition — описание условия
    forEach — объявление цикла
    startCounterValue — начало цикла
    finalCounterValue — конец цикла
    scope — объединение


  2. Убрать часть соглашения, касающееся внешней системы.



  3. Для простоты обработчик ошибок я тоже удалю. Весь тег faultHandlers.



  4. Удаляем assign запроса к внешней системе, оставим только копирование данных из запроса для идентификации запроса.
    
        $inputVariable.payload/SYSTEM/MSG_ID/@Value
        $outputVariable.payload/SYSTEM/MAIN_ID/@Value
    
  5. Удаляем все вызовы внешних систем invoke, кроме последнего в файле, где должен быть ответ нашему клиенту.
  6. Посмотрим переменную, в которую нужно записать ответ. В нашем случае это outputVariable
  7. Берем пример ответа, который наш дружелюбно предоставили разработчики или мы сами вытащили из SOA на функциональном стенде. И прописываем значения в нужные теги. Например
    Метод payload, операция ответа AnsSearchGetCustomerPartyAcc и xpath поставим свои.
    BEGIN[$itr] — элемент в цикле, означает $itr-итый элемент BEGIN внутри родительского.

    
        "0"
        $outputVariable.payload/DATA/AnsSearchGetCustomerPartyAcc/BEGIN_/accClntList/BEGIN_[$itr]/accClnt/BEGIN_/status/BEGIN_/code/@Value
    

Выпиливание вызовов внешних систем. Правим composit.xml
  1. Удалим импорт wsdl от внешнего сервиса.
  2. Уберем еще ссылку на внешний сервис.
  3. И еще соединение wire к удаляемому сервису GetCustomerPartyAccountBS
    
    ```GetCustomerPartyAccountsystReqA/GetCustomerPartyAccountBS
        GetCustomerPartyAccountBS
    

Выпиливание вызовов внешних систем. Правим .componentType и soaconfigplan.xml
  1. Убираем ссылку на внешний сервис в этих файлах.
  2. Пробуем собрать. Right Click на проекте → Make.
    Если все ОК, то деплоим, нет — разбираемся.

Деплой заглушки на локальный Weblogic
  1. Пробуем задеплоить.

    29aee0a5945648cd98b36016da931d9a.png


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

    6aa9e0d9321a4708864de89803cfc26d.png


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

    2327ee34901e4f1893d854163ea05627.png


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

    9694c491de0249f4b398f7b9cde31ba9.png


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

    eb90ed34f56648ac9502932cfa855317.png

    e65ec896db844736b3962dd08649a6f1.png


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

    19a370bab02547478f97c405d49cce35.png


  7. Summary.

    60c5ed9485924c489acea2507cf0db5d.png


  8. Лог деплоя.

    71c055c18b61471b842cd70028bf5a31.png


Примеры использования операторов

Несколько примеров интересных возможностей.


  1. Регулярные выражения.
    
        sender_bic
        xp20:matches($sender_bic,'(?!044525716|046577413|044030811|043602955|045004751|042007738|040349585|040813827)\d{9}') = true()
    ...
  2. Присвоение строки

    
        "0000000001CA3B1"
        $CITResponse/DATA/ReqSyncFinancialTransactionBatch/BEGIN_/documentList/BEGIN_/document/BEGIN_/extId/@Value
                                    
  3. Цикл и итератор.


    
    1
    count($onMessage_ExecuteFinancialTransactionBatch_InputVariable.part1/DATA/ReqExecFinancialTransactionBatch/BEGIN_/documentList/BEGIN_)
    ...

  4. Использование итератора в цикле.
    
        "BQ.00000.1415807097.277059967"
        $CITResponse/DATA/ReqSyncFinancialTransactionBatch/BEGIN_/documentList/BEGIN_[$ForEach1CounterInc]/document/BEGIN_/extId/@Value
    
  5. Много встроенный функций, например генерация guid.
    
        oraext:generate-guid()
        $CITResponse/SYSTEM/MSG_ID/@Value
    
  6. Или сравнение.
    xp20:compare($sender_bic,$recipient_bic) != 0
  7. Вкусное. Можно вставить Java.
    
     
         
     
    

Добавление в композит вызов сервиса

Есть бизнес-процесс который вызывает внешнюю систему, которая через какое-то время делает запрос в тестируемую систему. Этого в нашем бизнес-процессе нет.
Необходимо настроить партнерские соглашения с новым сервисом, прописать переменные и вставить invoke сервиса запросом ReqSyncFinancialTransactionBatch в наш бизнес-процесс.
Сервис-провайдер, который принимает запрос ReqSyncFinancialTransactionBatch тоже построен на SOA и по хорошему стечению обстоятельств от него есть композит.
Нужно его распаковать и перетащить все, что относится к вызову провайдера в наш композит.


  1. Добавляем пространства имен от провайдера и типа запроса в список.


    xmlns:ns27="urn:syst-ws:ws_soap-provider_ta" 
    xmlns:ns28="http://www.mybank.ru/ApplicationObjectLibrary/syst/Providers/DistributedFinancialTransactionProcessingBatchsystProvA/V1/SyncFinancialTransactionBatch_Request"   

  2. Добавление партнерского соглашения.
  3. Мне потребовалось еще и импортировать схемы.
    
        
  4. Пропишем переменные.
           
    
  5. Делаем присвоения в новом запросе, там где необходимо в соответствии со схемой.
    
        
            "cm.System.syst"
            $CITResponse/DATA/ReqSyncFinancialTransactionBatch/BEGIN_/systemTo/@Value
        
        
            "cm.System.BQ"
            $CITResponse/DATA/ReqSyncFinancialTransactionBatch/BEGIN_/systemFrom/@Value
                                             
        
            $onMessage_ExecuteFinancialTransaction_InputVariable.part2/DATA/ReqExecFinancialTransaction/BEGIN_/document/BEGIN_/id/@Value
            $CITResponse/DATA/ReqSyncFinancialTransactionBatch/BEGIN_/documentList/BEGIN_/document/BEGIN_/id/@Value
         
           
  6. Присвоение переменной во входную переменную для вызова сервиса. Смотрим в wsdl провайдера на сообщение, которое он понимает.


    
        
    

    
        
            $CITResponse
            $processPutSoapIn.parameters/ns27:REQUESTPUT
        
    

  7. Делаем вызов сервиса invoke, и вычитывание ответа receive, если нужно.
    Если нужно, проставляем необходимые хедеры к запросу с помощью bpelx: toProperties.


    
    
        
            'null'
        
                               
    
     

  8. Добавим отношение к новому сервису в файл .componentType


    ...
    
      
          
    

  9. Положим wsdl PROVIDER_TAWrapper.wsdl от сервиса в наш проект


  10. Добавим reference в файл сfgplan


    
      
         
            
               @@@systDistributedFinancialTransactionProviderTAWSDL@@@
            
            
               @@@systDistributedFinancialTransactionTAWSDL_httpConnTimeout@@@
            
            
               @@@systDistributedFinancialTransactionTAWSDL_httpReadTimeout@@@
            
         
      
      

  11. Добавим импорт wsdl, reference и wire в файл composit.xml
    Обратим внимание на ссылку к wsdl сервиса-провайдера location=«http://k10systwp.mybank.ru:7030/webproxy/WS/PROVIDER_TA? wsdl
    
    
          

    
      
      
         WSDLDriven
      
      
         
      
         

   
```DistributedFinancialTransactionProcessingBatchsystReqA/ProviderTAWSImport
      ProviderTAWSImport
     

  1. Все, пробуем собрать и деплоить

Тестирование композита


Проверим то, что мы наделали.


Проверка своего сервиса
  1. Берем SoapUI, генерируем mosk-сервис, используя wsdl от задеплоенного нами сервиса.
  2. Берем пример запроса к нашему сервису, прописываем в настройках в ReplyTo адрес mosk, которого только что создали. В Action прописываем операцию. Картинка кликабельна.

    6a02185fec174507acd4c16fb7417931.png

  3. Делаем запрос
  4. Смотрим, сервис отработал и прислал ответ. Картинка кликабельна.

    c3704c06b92a446f81a917e6f7cda67e.png


Проверка внедренного вызова в сервис
  1. Также возьмем SoapUI, генерируем mosk-сервис, используя wsdl от сервис-провайдера.
  2. Копируем адрес wsdl и прописываем его в файле composite.xml в нашем сервисе. Таким образом мы указываем куда будет идти внедренный запрос.
  3. Сохраняем, деплоим с другой версией. Снимаем также галочку в default, чтобы наш дебаг никому не помешал.

    16aac266ddad44f592741f487004c481.png

  4. Проверим, что все собралось без ошибок и идем в EM. Ищем наш сервис с новой ревизией.

    e25d7eb8a8e04146b960ba80a15b73a1.png

    f636b6e489fa4276a8854ad52309573a.png

  5. Сделаем запрос и проверим что внедренный вызов пришел на наш stub. Картинка кликабельна.

    d58672718b4e4a3e9e708466b2247e63.png


Анализ проблем при работе


Что делать если разработчики скажут, что наша заглушка тормозит, а у них все отлично?
Будем разбираться.


Поиск запросов в БД SOA

Потребовалось найти запросы по содержимому, чтобы понять что с ним случилось. Таблица CUBE_INSTANCE в нашей схеме DEV_SOAINFRA содержит всю историю по композитам. Но для просмотра надо ее вытащить из блоба.
Нашел тут функцию, которая это делает


код
        CREATE OR REPLACE PACKAGE SOA_UTIL AS

           -------------------------------------------------------------------------------------------
           -- Written by   : Gilberto Holms (https://gibaholms.wordpress.com/)
           -- Last update  : 07/11/2014
           -- Version      : 1.1
           -- Description  : Utility code to handle Oracle SOA Suite tables
           -- Release notes:
           --   1.0: Initial release
           --   1.1: Bug fix to work properly on SOA 10g
           -------------------------------------------------------------------------------------------

          FUNCTION GET_AUDIT_TRAIL(P_SCHEMA_NAME VARCHAR2, P_CIKEY NUMBER) RETURN CLOB;

        END SOA_UTIL;

        /

        CREATE OR REPLACE PACKAGE BODY SOA_UTIL AS

           -------------------------------------------------------------------------------------------
           -- Written by   : Gilberto Holms (https://gibaholms.wordpress.com/)
           -- Last update  : 07/11/2014
           -- Version      : 1.1
           -- Description  : Utility code to handle Oracle SOA Suite tables
           -- Release notes:
           --   1.0: Initial release
           --   1.1: Bug fix to work properly on SOA 10g
           -------------------------------------------------------------------------------------------

          FUNCTION GET_AUDIT_TRAIL(P_SCHEMA_NAME VARCHAR2, P_CIKEY NUMBER) RETURN CLOB
          AS
            V_AUDIT_BLOB BLOB;
            V_AUDIT_CLOB CLOB;

            V_CUR_AUDIT SYS_REFCURSOR;

            TYPE TP_AUDIT_RECORD IS RECORD(
              BLOCK NUMBER(38,0),
              LOG BLOB
            );
            TYPE TP_AUDIT_ARRAY IS TABLE OF TP_AUDIT_RECORD;
            V_AUDIT_ARRAY TP_AUDIT_ARRAY;
            V_AUDIT_COMPLETE BLOB;

            V_BUFFER_LENGTH PLS_INTEGER := 32767;
            V_BUFFER VARCHAR2(32767);
            V_READ_START PLS_INTEGER := 1;
        BEGIN

            DBMS_LOB.CREATETEMPORARY(V_AUDIT_BLOB, TRUE);
            DBMS_LOB.CREATETEMPORARY(V_AUDIT_CLOB, TRUE);
            DBMS_LOB.CREATETEMPORARY(V_AUDIT_COMPLETE, TRUE);

            OPEN V_CUR_AUDIT FOR 'SELECT BLOCK, LOG FROM ' || P_SCHEMA_NAME || '.AUDIT_TRAIL WHERE CIKEY = :cikey ORDER BY COUNT_ID' USING P_CIKEY;
            FETCH V_CUR_AUDIT BULK COLLECT INTO V_AUDIT_ARRAY;
            CLOSE V_CUR_AUDIT;

            FOR j IN 1..V_AUDIT_ARRAY.COUNT LOOP
                IF j = 1 THEN
                    DBMS_LOB.APPEND (V_AUDIT_BLOB, V_AUDIT_ARRAY(j).LOG);
                ELSE
                    IF ( V_AUDIT_ARRAY(j).BLOCK = V_AUDIT_ARRAY(j-1).BLOCK ) THEN
                        DBMS_LOB.APPEND (V_AUDIT_BLOB, V_AUDIT_ARRAY(j).LOG);
                    ELSE
                        DBMS_LOB.APPEND (V_AUDIT_COMPLETE, UTL_COMPRESS.LZ_UNCOMPRESS(V_AUDIT_BLOB));
                        DBMS_LOB.CREATETEMPORARY(V_AUDIT_BLOB, TRUE);
                        DBMS_LOB.APPEND (V_AUDIT_BLOB, V_AUDIT_ARRAY(j).LOG);
                    END IF;
                END IF;
            END LOOP;

            DBMS_LOB.APPEND (V_AUDIT_COMPLETE, UTL_COMPRESS.LZ_UNCOMPRESS(V_AUDIT_BLOB));
            V_AUDIT_ARRAY.DELETE;

            FOR i IN 1..CEIL(DBMS_LOB.GETLENGTH(V_AUDIT_COMPLETE) / V_BUFFER_LENGTH) LOOP
                V_BUFFER := UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(V_AUDIT_COMPLETE, V_BUFFER_LENGTH, V_READ_START));
                DBMS_LOB.WRITEAPPEND(V_AUDIT_CLOB, LENGTH(V_BUFFER), V_BUFFER);
                V_READ_START := V_READ_START + V_BUFFER_LENGTH;
            END LOOP;

            RETURN V_AUDIT_CLOB;

        END;

        END SOA_UTIL;

        /

и пример использования


SELECT
  CI.PROCESS_ID AS PROCESS_ID,
  CI.CIKEY AS INSTANCE_ID,
  CI.CREATION_DATE AS CREATION_DATE,
  CI.STATUS AS STEP,
  SOA_UTIL.GET_AUDIT_TRAIL('ORABPEL', CI.CIKEY) AS AUDIT_TRAIL_XML
FROM
  ORABPEL.CUBE_INSTANCE CI
WHERE
  CI.PROCESS_ID = 'MyBPEL'
  AND CI.CREATION_DATE BETWEEN (sysdate - 1) AND (sysdate)
  ORDER BY CI.CREATION_DATE DESC;

Картинки кликабельны.


  1. Ищем проблемный запрос. Картинка кликабельна.

    890c2546a72f4851a623ee4ac922565b.png

  2. Берем его индентификатор ECID
  3. Идем в EM и ищем запрос по ECID

    0d3538c44d79489690b98eb5ebc2bb28.png

  4. Смотрим что случилось и главное за какое мы ответили системе

    cdb647f244dd401ba97ea93ddda8f353.png

    feddbd5de4c045bdb1d349be7c754fb4.png


Мониторинг и замечания по работе

Тут ничего сложного


  1. Для мониторинга системных ресурсов и метрик soa eсть замечательная вкладка Perfomace summary.

    4217db8172ec405789fcff0bfca33c2f.png

  2. Есть свой скрипт, который будет слать soap запросы к заглушке раз в 30 секунд и замеряет время ответа. Можно его прикрутить к чему угодно, Grafana, Zabbix, Sitescope
  3. При работах потребовалось увеличить память для heap до 4096, сама машина с 16 gb ram.
  4. Так как история запросов растет, соответственно схема soa также пухнет. Требовалось расширять табличное пространство. Код можно найти в интернете, я приведу на всякий случай

Расширение табличного пространства
ALTER TABLESPACE DEV_SOAINFRA
ADD DATAFILE 'C:\APP\KALISTRATOVKA\ORADATA\ORCL\DEV_SOAINFRA07.DBF' size 20000M
AUTOEXTEND ON
NEXT 100M
MAXSIZE 20000M;

Размер табличного пространства можно смотреть в таблице dba_tablespace_usage_metrics


Заключение


За неизвестное можно и нужно браться и не бояться ошибиться. Да, и JDev мне понравился больше чем Eclipse.


Ссылки на источники:


http://www.oracle-adf.info/2014/03/oracle-soa-suite.html
https://shouab.wordpress.com/oracle-soa-11g-step-by-step-installation-guide/
http://www.theserverside.com/news/1364554/BPEL-and-Java
http://samolisov.blogspot.ru/2009/06/soa-bpel.html
http://docs.oracle.com/cd/E15586_01/integration.1111/e10224/bp_java.htm
https://gibaholms.wordpress.com/2014/02/03/export-audit-trail-from-database-soa-10g-and-11g/

Комментарии (0)

© Habrahabr.ru