Pull to refresh
0

Как организовать взаимодействие процессов в Oracle BPM

Reading time5 min
Views2.8K
Сложно представить себе полностью изолированный процесс, т.е. выполнение задач без необходимости обращения к внешним информационным источникам и в большинстве случаев BPMN процесс представляет из себя оркестровку таких вызовов. Причем он может обращаться как синхронно так и асинхронно к интеграционным сервисам приложений, другим BPMN или BPEL процессам. Масса реальных задач требует от архитекторов и разработчиков серьезного подхода к вопросу организации взаимодействия решения с «внешним» миром и дело здесь не ограничивается исключительно интеграционным подходом, важно поддерживать сам контекст подобных связей.

Oracle BPM предлагает такие механизмы взаимодействия, которые способны поддерживать сложную коммуникационную среду из разнородных приложений и процессов, где, к примеру, параллельно выполняющиеся потоки работ могут свободно «общаться» друг с другом по ходу выполнения. Т.о. можно выстроить цепочку связей из взаимозависимых задач разных процессов, широко применяя т.н. модульный подход. Модульный подход, в свою очередь, позволяет сэкономить массу времени при разработке и сопровождения решений, т.к. модули могут разрабатываться и тестироваться независимо друг от друга и многократно использоваться в разных частях процесса.

В виде модулей могут выступать, как BPMN, так и BPEL процессы, позволяя выносить многократно используемую логику выполнения в отдельные компоненты и коммуницировать с ними посредством предоставляемых механизмов взаимодействия. Может случиться так, что в будущем все ваши процессы будут представлять из себя оркестровку из ранее реализованных модулей, что сводит трудозатраты к реализации подобных задач к минимуму, все ваше основное внимание будет сосредоточено к организации связей между повторно используемыми компонентами. Подобное межкомпонентное взаимодействие известно под краткой аббревиатурой — IPC (Inter Process Communication), которое объединяет под собой различные способы обмена сообщениями и синхронизации данных.

Рассмотрим пример такого взаимодействия. В Oracle BPM меж-процессные коммуникации объединены в такое понятие как Conversation, с помощью него определяется сценарий взаимодействия между участниками общения. Причем в качестве участников могут выступать разные компоненты решения, такие как BPMN или BPEL процессы, Human Tasks, Business Rules, внешние по отношению к процессу сервисы.

Существует разные типы Conversation, которые определяют интерфейс «общения» вашего процесса с другими процессами или сервисами, это может быть свой собственный интерфейс, либо доступный по-умолчанию. Подробную информацию об этом можно найти в соответствующей документации Oracle. В нашей демонстрации мы ограничимся обменом данных между двумя процессами, поэтому в нашем случае мы будем использовать доступный по умолчанию интерфейс для меж-процессного взаимодействия:

1. Первый процесс – основной, эмулирует этапы обработки заявки;
2. Второй процесс – вспомогательный, эмулирует запрос дополнительной информации по заявке, которая может занять некоторое время и результаты проверки могут понадобиться основному процессу не сразу, но на одном из этапов выполнения.

Как видим при таком сценарии нам необходимо организовать параллельное выполнение 2-х процессов, которые взаимодействуют друг с другом в режиме исполнения.

Итак запустим среду JDeveloper и откроем ранее созданное в предыдущей статье приложение «Samples». Повторите шаги по его созданию если у вас его нет. Создадим 2-й процесс, который будет эмулировать работу некоего фонового процесса эмулирующий деятельность проверки данных по заявке:

1. Правой кнопкой мыши щелкнем по проекту «PubSubPr», выберем опцию «New» и из галереи выберем шаблон создания нового процесса «BPMN 2.0 Process»;
2. В открывшемся окне «Мастера» в качестве имени укажем «BackgroundProcess», в качестве типа процесса укажите «Asynchronous Service» (процесс с асинхронным интерфейсом взаимодействия);
3. В качестве входного аргумента процесса (Input) укажите переменную с именем «reqProcess» в качестве типа укажите QuoteRequest, доступной из xsd схемы Quote общедоступного примера Sales Quote Demo:
image
4. В качестве выходного аргумента процесса (Output) укажите переменную с именем «checkResult» в качестве типа переменной укажите Boolean;
5. Нажмите «Finish», на этом шаги по созданию процесса завершены, далее создадим в нем необходимые активности;
6. Создадим переменную процесса checkResult с типом Boolean:
image
7. В первую очередь эмулируем выполнение некой длительной по времени деятельности, для этого перенесем на процесс активность «Timer» из палитры компонентов процесса раздела «Catch Events»;
8. В открывшемся диалоговом окне, оставим имя активности по-умолчанию и сразу перейдем на вкладку «Implementation», здесь укажите период ожидания равным 1 мин., как на картинке ниже:
image
9. Опять же с целью эмуляции результата выполнения некоторой деятельности перенесем из палитры компонентов на диаграмму процесса активность «Script» и в открывшемся окне «Мастера» оставим имя по-умолчанию и перейдем на вкладку «Implementation», здесь инициализируем процессную переменную в «true» с помощью «Data Associations»:
image
10. Чтобы процесс вернул ожидаемое значение вызвавшей его стороне настроим маппинг данных активности «End» процесса:
image

На этом создание вспомогательного процесса завершено. Теперь внесем необходимые изменения в основной процесс и настроим взаимодействие со вспомогательным. За базу основного процесса мы возьмем уже имеющийся в проекте «PubSubPr» процесс – «Process» и выполним последовательно следующие шаги:

1. Изменим тип старта процесса на «Message», определим новый интерфейс для обмена сообщениями и в качестве аргумента укажем переменную quoteRequest с типом «QuoteRequest» в качестве имени операции укажем «start»:
image
2. Настроим маппинг данных переменной аргумента с переменной процесса:
image
3. Теперь создадим т.н. «Conversation», который мы в последствии будем использовать для взаимодействия с вспомогательным процессом, в структуре процесса щелкнем правой кнопке мыши по узлу «Conversation» и выберем «new».
4. В открывшемся окне присвоим имя «Process_BackgroundProcess» в качестве типа взаимодействия укажем «Process Call», после чего нам доступна возможность выбора процесса который необходимо вызвать, укажите «BackgroundProcess»:
image
5. Перенесите на процесс активность «ThrowEvent», которая будет вызывать наш вспомогательный процесс и в качестве «Conversation» укажите только что созданный – «Process_BackgroundProcess», а в качестве вызываемого узла укажите «Start»:
image
После чего укажем маппинг данных:
image
6. Теперь перенесите на процесс активность «CatchEvent», достигнув которую процесс будет ожидать результат работы вспомогательного процесса, в качества Conversation укажите «Process_BackgroundProcess», в качестве вызываемого узла укажите «End»:
image
После выполненных действий скопируйте результат работы процесса в переменную процесса checkResult (если она отсутствует создайте):
image
7. Далее нужно несколько модифицировать саму диаграмму процесса для эмуляции действий в нем, выполните изменения согласно представленной диаграммы ниже (обратите внимание, что все активности в процессе отмечены как «черновики» за это отвечает соответствующий флаг активности – «Is Draft»).
image
Для «условной» ветки ведущей к задаче «ReviewTask» (выделено красным) укажите условие перехода:
image

В результате выполненных действий мы получили готовый для тестирования проект состоящий из 2-х взаимодействующих процессов. Развернем его на интегрированном в JDeveloper сервере приложений Weblogic. Для этого правой кнопкой мыши выберем наш проект «PubSubPr» и выберем опцию «Run»:
image

После того как наше приложение будет развернуто на интегрированном в JDeveloper сервере weblogic мы можем приступить к тестированию. Откроем консоль системного мониторинга Enterprise Manager по адресу localhost:7101/em, откроем развернутое приложение — PubSubPr и выберем для тестирования web-сервис Process.service:
image

После чего проверим историю запущенных инстансов процесса:
image

Проверим историю выполнения завершенного инстанса процесса:
image

Здесь можно увидеть, что в момент прохождения токена процесса активности «ThrowEvent» (в нашем случае время выполнения активности «13:50:14») был асинхронно вызван процесс «BackgroundProcess» (время старта «13:50:15»):
image

Затем, выполнив несколько шагов, наш основной процесс «Process» ждал 1 минуту пока «BackgroundProcess» вернет ответ в активности «CatchEvent», после чего он продолжил свое выполнение.

Мы также можем наглядно увидеть диаграмму взаимодействия процессов на стадии разработки процесса в JDeveloper. Она доступна на диаграмме BPMN модели нашего основного процесса на вкладке «Collaboration»:
image
Tags:
Hubs:
+4
Comments2

Articles

Change theme settings

Information

Website
www.oracle.com
Registered
Founded
Employees
Unknown
Location
США