Tutorial: присваиваем название процессу, исполняемому внутри SOA SUITE

  • Tutorial
Возможно вы не знали, но Московская Биржа – это группа компаний, и одной из наших самых больших и важных составляющих является Национальный расчетный депозитарий (НРД). Без НРД у профучастников российского и международного рынка не было бы понятных и прозрачных расчетных и депозитарных услуг, так необходимых при совершении сделок. Как и положено ИТ-компании, НРД совместно с Биржей постоянно совершенствует свою внутреннюю IT-архитектуру.

Начиная с 2014 года осуществляется внедрение и перевод интеграционного взаимодействия между внутренними системами на промышленное ПО промежуточного слоя – стек продуктов Oracle Fusion Middleware, центральное место в котором занимает Oracle SOA Suite. Этот продукт является узкоспециализированным и материалов на русском языке по нему крайне мало. В блоге Биржи мы планируем регулярно рассказывать о наших находках и открытиях, связанных с внедрением SOA Suite. Не стоит ожидать здесь появления полноценного курса, скорее это будут заметки на разные проблемные темы, для которых мы не нашли чётко сформулированных рецептов и теперь хотим поделиться своими результатами с другими специалистами. Надеемся, что в каждой статье читатель сможет найти для себя что-то новое и полезное.


В последней версии 12c своего продукта SOA Suite компания Oracle реализовала полезную вещь – в панели управления Enterprise Manager вместо отдельных экземпляром композитных приложений стали отображаться исполняемые цепочки (business flow, как это называется в официальной документации). Но при большом количестве одновременно работающих приложений проблема поиска нужного экземпляра композитного приложения или цепочки всё равно остаётся.
Типовое решение в данной ситуации заключается в использовании имени цепочки (Flow Name) для того, чтобы отразить в нём информацию, позволяющую однозначно связать цепочку с данными, которые она обрабатывает. Обычно – это идентификаторы, названия, референсы передаваемых сообщений. Панель управления позволяет фильтровать выборки по названиям, включая стандартные шаблоны SQL-конструкции LIKE.
Для указания названия цепочки существует функция oraext:setFlowInstanceTitle(). Её можно использовать, например, в Assign Activity, (рисунок 1):
<assign name="AssignFlowName">
  <copy>
    <from>oraext:setFlowInstanceTitle(string($inputVariable.payload/client:name))</from>
    <to>$outputVariable.payload/client:name</to>
  </copy>
</assign>


Рисунок 1. Функция для указания названия цепочки.
image

Возможность указания названия для одного композитного приложения (а не всей цепочки) функцией ora:setCompositeInstanceTitle()также осталась, но при наличии возможностей именовать цепочки она уже совершенно неинтересна (и далее в статье не рассматривается).
Обе эти функции, однако, будут работать с установленным исправлением #18310693 (входит в последний на момент написания статьи Patch #20900599: SOA Bundle Patch 12.1.3.0.3). Если же вы ещё не обновили свой сервер, то будет работать только вызов из Java Embedding:
<extensionActivity>
  <bpelx:exec name="JavaFlowName" language="java">
    <![CDATA[setFlowInstanceTitle((String)getVariableData("titleVar"));]]>
  </bpelx:exec>
</extensionActivity>

В приложенном архиве содержится пример композитного приложения с обоими вариантами указания названия. Передаваемая на вход web-сервиса строка присваивается в качестве названия цепочки обоими указанными способами (для варианта Java Embedding выставлен флаг пропуска <bpelx:skipCondition>true()</bpelx:skipCondition>). Вы можете загрузить приложение на свой сервер и экспериментировать с названиями, используя встроенные в Enterprise Manager средства тестирования (рисунки 2, 3).

Рисунок 2.Вызов композитного приложения в Enterprise Manager.
image

Рисунок 3.Цепочка с заданным названием.
image

Если вы передадите строку длиной более 100 символов, композитное приложение упадёт с ошибкой:
ORA-12899: value too large for column «DEV12C_SOAINFRA».«SCA_FLOW_INSTANCE».«TITLE» (actual: 101, maximum: 100)
(в данном случае DEV12C – это префикс для системных схем, указанный во время установки SOA Suite).
Да-да, всё правильно, используя легальное API можно элементарным образом нарушить выполнение приложения – SOA Suite отводит для хранения названий цепочек поле размером в 100 символов. И этот случай, к сожалению, не единственный. Известно несколько сценариев переполнения текстовых полей, в том числе и тогда, когда их значений генерируются системным образом (не зависят от пользовательского ввода).
Типичный ответ Oracle Support на ошибки подобного рода: Расширьте поле в базе. Так как некоторые ошибки были известны ещё в прошлой версии 11g и благополучно переехали в версию 12c, то пытаться решить их системным образом, на наш взгляд, бесполезно. Поэтому для гарантии стабильной работы сервера приходится ставить заплатки. В своих контурах мы:
  • Расширили значение проблемного поля до 256 символов, потому что 100 символов – это всё-таки очень мало.
  • Во всех присваиваниях дополнительно обрезаем текстовую строку посредством substring():

<assign name="AssignFlowName">
  <copy>
    <from>oraext:setFlowInstanceTitle(substring(string($inputVariable.payload/client:name), 1, 256))</from>
    <to>$outputVariable.payload/client:name</to>
  </copy>
</assign>


Самое надёжное решение – это реализовать специальную функцию-расширение для SOA Suite, которая внутри себя будет выполнять необходимый контроль длины, и использовать только её. Об этом в одной из будущих статей расскажет Хорошилов Александр, руководитель направления интеграции, отдел разработки интеграционных систем НРД, благодаря которому и появилась эта публикация.
Московская Биржа
52,06
Крупнейшая Биржа России, СНГ и Восточной Европы
Поделиться публикацией

Комментарии 1

    +1
    Я правильно понял, что статья о том как добавить/изменить одну единственную строчку на весь business flow?
    И эта функция появилась в последней версии?
    И это в продукте SOA Suite стоимостью страшно подумать сколько в год…

    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

    Самое читаемое