Розробка заглушок бізнес-процесу на мові BPEL на основі Oracle SOA Suite і Weblogic

У цій статті я розповім як реалізувати заглушки веб-сервісів бізнес-процесу на 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.
Далі я розповім про:
  • Розгортання свого стенду
  • З'єднання MDS
  • Імпорт існуючого композиту
  • Випилювання виклику зовнішніх систем
  • Вставку приклад успішної відповіді
  • Приклади використання операторів
  • Додавання в композит нового веб-сервісу
  • Виклик асинхронного сервісу
  • Деплой композиту
  • Перевірку модифікованого композиту
  • Аналіз проблем при проведенні тестування
  • Моніторинг та зауваження при роботі
BPEL — мову на основі XML для формального опису бізнес-процесів і протоколів їх взаємодії між собою.
Треба сказати, що BPEL досить велика і зручна штука, що дозволяє вставляти різні оператори, дебаг і шматки коду, наприклад Java.
Бізнес процес виглядає приблизно так:


Весь бізнес-процес будується у вигляді композиту і встановлюється на сервер-додатків. Запросив робочий композит з функціонального стенду, налаштував 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. Вибір шляху для домашньої теки.



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



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



  5. Вкажемо папку з JDK.



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



  7. Установка і привітання.

Установка OracleВ установці немає нічого складного, зупинюся лише на деяких моментах.
Пропустимо мінімальні вимоги і поставимо Oracle Database 11g Release 2 x32 для Windows, виберемо Desktop Class. Нам для розробки вистачить.
В інтернеті, в тому числі і на хабре є багато статей по установці. Зазначу тільки установку під локальним адміном і завдання змінних оточення. Хоча помилка з відсутністю ORACLE_UNQNAME не завадила і все завелося.


Установка SOA Suite
  1. Для запуску інсталятора треба вказати шлях до JRE або JDK.
    ofm_soa_generic_11.1.1.7.0/Disk1/setup.exe -jreLoc c:\Oracle\Middleware\jdk160_24

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



  3. Перевірка операційної системи і фізичної пам'яті, у разі помилки можна проігнорувати.



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



  5. Далі установник знайшов Weblogic у домашній теці.



  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.



  3. Вказуємо параметри БД, в нашому випадку це localhost, 1521, sys і пароль. Далі йде перевірка.
  4. Слідом треба вказати префікс імен схем даних (за замовчуванням DEV) і вибрати компоненти репозиторію, нам потрібні Metadata Services і SOA Infrastructure, User Messaging Service вибирається автоматично.



  5. Вкажемо пароль для користувачів, власників схем з даними для репозиторію.



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



  7. Запуск створення tablespaces.



  8. Готово.



Створення WebLogic домену і запуск серверів
  1. Запускаємо установку.
    Щоб його створити запустимо файл config.cmd в папці
    C:\Oracle\Middleware\Oracle_SOA1\common\bin

    У мене JDK 1.7, тому він лайнувся


    Ми її обійдемо — міняємо 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. Вибираємо створення нового домену.



  3. Вибираємо Oracle SOA Suite Enterprise Manager. WSM Policy Manager і JRF виберуться автоматично.



  4. Вказуємо ім'я і шлях до домену і додатків.



  5. Пароль для користувача weblogic.



  6. JDK та тип інсталяції. Залишимо Development Mode.



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



  8. Перевірка.



  9. Налаштовувати не будемо, залишимо порожніми.



  10. Тиснемо створити.
  11. Готово. Запустимо Admin Server.



  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 (якщо ви використовували порт за замовчуванням при установці).



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


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







Підготовка до розробки


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





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


  3. Створення підключення до MDS. View->Resource palette->New Connection->SOA-MDS



Імпорт існуючого композиту
  1. Створення порожнього проекту. (File- > New).








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







Розробка


Расковыряем композит і задеплоим
Випилювання викликів зовнішніх систем. Редагування BPEL-файлуНа картинці вище можна бачити в правій частині є зовнішня система і бізнес-процес її викликає методом invoke.
Давайте приберемо це непотрібне. Я буду робити це в блокноті. Але можна і у інтерфейсі.


  1. Короткий екскурс.
    Файл складається з блоків, варіацій більше, я назву деякі:
    process — кореневої тег для процесу
    partnerLinks — партнерські угоди між сервісами
    variables — декларація змінні
    faultHandlers — обробники помилок
    sequence main — бізнес-процес
    receive — отримання запиту від клієнта
    assign — блок присвоєння змінних
    copy — копіювання даних з одного об'єкта в інший
    invoke — виклик веб-сервісу
    if, elseif, else — оголошення умов
    condition — опис умови
    forEach — оголошення циклу
    startCounterValue — початок циклу
    finalCounterValue — кінець циклу
    scope — об'єднання
  2. Прибрати частина угоди, що стосується зовнішньої системи.
    <partnerLink name="GetCustomerPartyAccountBS"
    partnerLinkType="ns2:GetCustomerPartyAccount"
    partnerRole="GetCustomerPartyAccountProvider"
    myRole="GetCustomerPartyAccountRequester"/>

  3. Для простоти обробник помилок я теж видалю. Весь тег faultHandlers.
    <faultHandlers/>

  4. Видаляємо assign запиту до зовнішньої системи, залишимо тільки копіювання даних із запиту для ідентифікації запиту.
    <copy>
    <from>$inputVariable.payload/SYSTEM/MSG_ID/@Value</from>
    <to>$outputVariable.payload/SYSTEM/MAIN_ID/@Value</to>
    </copy>
  5. Видаляємо всі виклики зовнішніх систем invoke, крім останнього у файлі, де має бути відповідь нашому клієнтові.
    <invoke name="callbackClient"
    partnerLink="getcustomerpartyaccountsystreqa_client"
    portType="ns1:GetCustomerPartyAccountsystReqACallback"
    operation="processResponse" inputVariable="outputVariable"/>
  6. Подивимося змінну, в яку потрібно записати відповідь. У нашому випадку це outputVariable
  7. Беремо приклад відповіді, який наш дружелюбно надали розробники або ми самі витягнули з SOA на функціональному стенді. І прописуємо значення в потрібні теги. Наприклад,
    Метод payload, операція відповіді AnsSearchGetCustomerPartyAcc і xpath поставимо свої.
    BEGIN[$itr] — елемент в циклі, означає $itr-итый елемент BEGIN батьківського.
<copy bpelx:insertMissingToData="так"
ignoreMissingFromData="так">
<from>"0"</from>
<to>$outputVariable.payload/DATA/AnsSearchGetCustomerPartyAcc/BEGIN_/accClntList/BEGIN_[$itr]/accClnt/BEGIN_/status/BEGIN_/code/@Value</to>
</copy>

Випилювання викликів зовнішніх систем. Правимо composit.xml
  1. Видалимо імпорт wsdl від зовнішнього сервісу.
    <import importType="wsdl" location="oramds:/apps/EDM/EnterpriseBusinessServiceLibrary/GetCustomerPartyAccountBS/V1/GetCustomerPartyAccountBSV1.wsdl" 
    namespace="http://www.ru/EnterpriseBusinessServiceLibrary/GetCustomerPartyAccountBS/V1"/>

  2. Приберемо ще посилання на зовнішній сервіс.
    <reference name="GetCustomerPartyAccountBS">
  3. І ще з'єднання wire до удаляемому сервісу GetCustomerPartyAccountBS
    <wire>
    ``GetCustomerPartyAccountsystReqA/GetCustomerPartyAccountBS</source.uri>
    <target.uri>GetCustomerPartyAccountBS</target.uri>
    </wire>

Випилювання викликів зовнішніх систем. Правимо .componentType і soaconfigplan.xml
  1. Прибираємо посилання на зовнішній сервіс у цих файлах.
    <reference name="GetCustomerPartyAccountBS">

  2. Пробуємо зібрати. Right Click на проекті -> Make.
    Якщо все ОК, то деплоим, ні — розбираємося.

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




  2. Вибір операції.



  3. Можна створити кілька сервісів з однаковим ім'ям, але різної версії.
    Викликати можна все, але за стандартним адресою буде працювати тільки default-ревізії. В Enterprise Manager можна застосувати default на задеплоенном композиті.



  4. Вибір сервера.



  5. Додамо локальний сервер. Тиснемо плюс.





  6. Вибір SOA сервера.



  7. Summary.



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



Приклади використання операторівКілька прикладів цікавих можливостей.
  1. Регулярні вирази.
    <if name="If_ChooseSync">
    <documentation>sender_bic</documentation>
    <condition>xp20:matches($sender_bic,'(?!044525716/046577413/044030811/043602955/045004751/042007738/040349585/040813827)\d{9}') = true()</condition>
    ...
  2. Присвоєння рядків
    <extId Value="0000000001CA3B1"/>

    <copy ignoreMissingFromData="так" bpelx:insertMissingToData="так">
    <from>"0000000001CA3B1"</from>
    <to>$CITResponse/DATA/ReqSyncFinancialTransactionBatch/BEGIN_/documentList/BEGIN_/document/BEGIN_/extId/@Value</to>
    </copy> 
  3. Цикл і ітератор.
    <forEach parallel="ні" counterName="ForEach1CounterSync" name="ForEachSync">
    <startCounterValue>1</startCounterValue>
    <finalCounterValue>count($onMessage_ExecuteFinancialTransactionbatch_inputvariable.part1/DATA/ReqExecFinancialTransactionBatch/BEGIN_/documentList/BEGIN_)</finalCounterValue>
    ...

  4. Використання ітератора в циклі.
    <copy ignoreMissingFromData="так" bpelx:insertMissingToData="так">
    <from>"BQ.00000.1415807097.277059967"</from>
    <to>$CITResponse/DATA/ReqSyncFinancialTransactionBatch/BEGIN_/documentList/BEGIN_[$ForEach1CounterInc]/document/BEGIN_/extId/@Value</to>
    </copy>
  5. Багато вбудований функцій, наприклад генерація guid.
    <copy>
    <from>oraext:generate-guid()</from>
    <to>$CITResponse/SYSTEM/MSG_ID/@Value</to>
    </copy>
  6. порівняння.
    <condition>xp20:compare($sender_bic,$recipient_bic) != 0</condition>
  7. Смачне. Можна вставити Java.
    <extensionActivity>
    <bpelx:exec language="java">
    <![CDATA[XMLElement elem = (XMLElement) getVariableData("output",
    "payload");
    String t = elem.getTextContent();
    elem.setTextContent(t + ", set by java exec 2");]]>
    </bpelx:exec>
    </extensionActivity>

Додавання в композит виклик сервісуЄ бізнес-процес, який викликає зовнішню систему, яка через якийсь час робить запит в тестову систему. Цього в нашому бізнес-процесі немає.
Необхідно налаштувати партнерські угоди з новим сервісом, прописати змінні і вставити 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. Додавання партнерської угоди.
    <import namespace="urn:syst-ws:ws_soap-provider_ta"
    location="oramds:/apps/EDM/mybank/ApplicationObjectLibrary/syst/wsdls/ProviderTA/V1/PROVIDER_TA.wsdl"
    importType="http://schemas.xmlsoap.org/wsdl/"/>
  3. Мені знадобилося ще і імпортувати схеми.
    <import namespace="urn:syst-ws:ws_soap-provider_ta"
    location="oramds:/apps/EDM/mybank/ApplicationObjectLibrary/syst/wsdls/ProviderTA/V1/PROVIDER_TA.wsdl"
    importType="http://schemas.xmlsoap.org/wsdl/"/>
    <import namespace="http://www.mybank.ru/ApplicationObjectLibrary/syst/Providers/DistributedFinancialTransactionProcessingBatchsystProvA/V1/SyncFinancialTransactionBatch_Request"
    location="oramds:/apps/EDM/mybank/ApplicationObjectLibrary/syst/schemas/Providers/DistributedFinancialTransactionProcessingbatchsystprova/V1/SyncFinancialTransactionBatch_Request.xsd"
    importType="http://www.w3.org/2001/XMLSchema"/> 
  4. Пропишемо змінні.
    <variable name="CITResponse" element="ns28:CIT_REQUEST"/> 
    <variable name="processPutSoapIn" messageType="ns27:PROCESSPUTSoapIn"/>
  5. Робимо присвоєння в новому запиті, там де необхідно згідно зі схемою.
    <assign name="AssignOK">
    <copy ignoreMissingFromData="так" bpelx:insertMissingToData="так">
    <from>"cm.System.syst"</from>
    <to>$CITResponse/DATA/ReqSyncFinancialTransactionBatch/BEGIN_/systemTo/@Value</to>
    </copy>
    <copy ignoreMissingFromData="так" bpelx:insertMissingToData="так">
    <from>"cm.System.BQ"</from>
    <to>$CITResponse/DATA/ReqSyncFinancialTransactionBatch/BEGIN_/systemFrom/@Value</to>
    </copy> 
    <copy ignoreMissingFromData="так" bpelx:insertMissingToData="так">
    <from>$onMessage_ExecuteFinancialTransaction_InputVariable.part2/DATA/ReqExecFinancialTransaction/BEGIN_/document/BEGIN_/id/@Value</from>
    <to>$CITResponse/DATA/ReqSyncFinancialTransactionBatch/BEGIN_/documentList/BEGIN_/document/BEGIN_/id/@Value</to>
    </copy> 
    </assign> 
  6. Привласнення змінної у вхідну змінну для виклику сервісу. Дивимося в wsdl провайдера на повідомлення, яке він розуміє.
    <wsdl:message name="PROCESSPUTSoapIn">
    <wsdl:part name="parameters" element="tns:PROCESSPUT"/>
    </wsdl:message>

    <assign name="assignResponse">
    <copy ignoreMissingFromData="так" bpelx:insertMissingToData="так">
    <from>$CITResponse</from>
    <to>$processPutSoapIn.parameters/ns27:REQUESTPUT</to>
    </copy>
    </assign>

  7. Робимо виклик сервісу invoke, і вичитування відповіді receive, якщо потрібно.
    Якщо потрібно, проставляємо необхідні хедеры до запиту з допомогою bpelx:toProperties.
    <sequence>
    <invoke name="sendResponse"
    inputVariable="processPutSoapIn"
    partnerLink="ProviderTAWSImport" portType="ns27:PROVIDER_TASoap"
    operation="Async_PROCESSPUT"
    bpelx:invokeAsDetail="ні">
    <bpelx:toProperties>
    <bpelx:toProperty name="replyToAddress">'null'</bpelx:toProperty>
    </bpelx:toProperties>
    </invoke> 
    <receive name="receiveResponse"
    createInstance="ні"
    partnerLink="ProviderTAWSImport"
    portType="ns27:PROVIDER_TACallbackSoap"
    operation="Async_PROCESSPUTCallback"
    variable="processPutSoapOut"
    xmlns="http://docs.oasis-open.org/wsbpel/2.0/process/executable"/>
    </sequence> 

  8. Додамо ставлення до нового сервісу в файл .componentType
    ...
    <reference name="ProviderTAWSImport" ui:wsdlLocation="PROVIDER_TAWrapper.wsdl">
    <interface.wsdl interface="urn:syst-ws:ws_soap-provider_ta#wsdl.interface(PROVIDER_TASoap)" callbackInterface="urn:syst-ws:ws_soap-provider_ta#wsdl.interface(PROVIDER_TACallbackSoap)"/>
    </reference> 
    </componentType>

  9. Покладемо wsdl PROVIDER_TAWrapper.wsdl від сервісу в наш проект
  10. Додамо reference у файл сfgplan
    <composite name="DistributedFinancialTransactionProcessingbatchsystreqa">
    <reference name="ProviderTAWSImport">
    <binding type="ws">
    <attribute name="location">
    <replace>@@@systDistributedFinancialTransactionprovidertawsdl@@@</replace>
    </attribute>
    <property name="oracle.webservices.httpConnTimeout">
    <replace>@@@systDistributedFinancialTransactiontawsdl_httpconntimeout@@@</replace>
    </property>
    <property name="oracle.webservices.httpReadTimeout">
    <replace>@@@systDistributedFinancialTransactiontawsdl_httpreadtimeout@@@</replace>
    </property>
    </binding>
    </reference>
    </composite> 

  11. Додамо імпорт wsdl, reference і wire в файл composit.xml
    Звернемо увагу на посилання до wsdl сервісу-провайдера location="http://k10systwp.mybank.ru:7030/webproxy/WS/PROVIDER_TA?wsdl
    <import importType="wsdl" location="PROVIDER_TAWrapper.wsdl" namespace="urn:syst-ws:ws_soap-provider_ta"/>
    <import importType="wsdl" location="PROVIDER_TAWrapper1.wsdl" namespace="urn:syst-ws:ws_soap-provider_ta"/>
    <import importType="wsdl" location="PROVIDER_TAWrapper2.wsdl" namespace="urn:syst-ws:ws_soap-provider_ta"/> 
<reference name="ProviderTAWSImport" ui:wsdlLocation="oramds:/apps/EDM/mybank/ApplicationObjectLibrary/syst/wsdls/ProviderTA/V1/PROVIDER_TA.wsdl">
<interface.wsdl callbackInterface="urn:syst-ws:ws_soap-provider_ta#wsdl.interface(PROVIDER_TACallbackSoap)" interface="urn:syst-ws:ws_soap-provider_ta#wsdl.interface(PROVIDER_TASoap)"/>
<binding.ws location="http://k10systwp.mybank.ru:7030/webproxy/WS/PROVIDER_TA?wsdl" port="urn:syst-ws:ws_soap-provider_ta#wsdl.endpoint(PROVIDER_TA/PROVIDER_TASoap)" soapVersion="1.1">
<property many="false" name="weblogic.wsee.wsat.transaction.flowOption" type="xs:string">WSDLDriven</property>
</binding.ws>
<callback>
<binding.ws port="urn:syst-ws:ws_soap-provider_ta#wsdl.endpoint(PROVIDER_TA/PROVIDER_TACallbackSoap_pt)"/>
</callback>
</reference> 

<wire>
``DistributedFinancialTransactionProcessingbatchsystreqa/ProviderTAWSImport</source.uri>
<target.uri>ProviderTAWSImport</target.uri>
</wire> 

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

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


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


  3. Робимо запит
  4. Дивимося, сервіс відпрацював і надіслав відповідь. Картинка кликабельна.



Перевірка впровадженого виклику в сервіс
  1. Також візьмемо SoapUI, генеруємо mosk-сервіс, використовуючи wsdl від сервіс-провайдера.
  2. Копіюємо адресу wsdl і прописуємо його у файлі composite.xml в нашому сервісі. Таким чином ми вказуємо куди буде йти вбудований запит.
    <binding.ws location="http://k10-emul:8089/mockPROVIDER_TASoap?WSDL" port="urn:ws:ws_soap-provider_ta#wsdl.endpoint(PROVIDER_TA/PROVIDER_TASoap)" soapVersion="1.1">
  3. Зберігаємо, деплоим з іншою версією. Знімаємо також галочку в default, щоб наш дебаг нікому не завадив.


  4. Перевіримо, що все зібралося без помилок і йдемо в EM. Шукаємо наш сервіс з новою ревізією.




  5. Зробимо запит і перевіримо що впроваджений виклик прийшов на наш stub. Картинка кликабельна.



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


Що робити якщо розробники скажуть, що наша заглушка гальмує, а у них все відмінно?
Будемо розбиратися.
Пошук запитів до БД 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 'BLOCK SELECT, 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. Шукаємо проблемний запит. Картинка кликабельна.


  2. Беремо його индентификатор ECID
  3. Йдемо у EM і шукаємо запит ECID


  4. Дивимося що сталося і головне за яке ми відповіли системі





Моніторинг та зауваження по роботіТут нічого складного
  1. Для моніторингу системних ресурсів і метрик soa є чудова вкладка Perfomace summary.


  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 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.