Трудно представить полностью изолированный процесс, т.е.
выполнение задач без необходимости обращения к внешним источникам информации и в большинстве случаев процесс BPMN представляет собой оркестровку таких вызовов.
Более того, он может получать доступ к службам интеграции приложений, другим процессам BPMN или BPEL как синхронно, так и асинхронно.
Множество реальных проблем требуют от архитекторов и разработчиков серьёзного подхода к вопросу организации взаимодействия решения с «внешним» миром, и здесь дело не ограничивается исключительно интеграционным подходом, важно сохранить сам контекст таких связей.
Oracle BPM предлагает механизмы взаимодействия, которые способны поддерживать сложную коммуникационную среду разрозненных приложений и процессов, где, например, одновременно выполняющиеся рабочие потоки могут свободно «общаться» друг с другом по мере их продвижения.
Что.
можно построить цепочку связей из взаимозависимых задач разных процессов, широко используя т. н.
модульный подход. Модульный подход, в свою очередь, позволяет сэкономить массу времени при разработке и сопровождении решений, поскольку модули можно разрабатывать и тестировать независимо друг от друга и повторно использовать в разных частях процесса.
Процессы BPMN и BPEL могут выступать в качестве модулей, позволяя переносить многократно используемую логику выполнения в отдельные компоненты и взаимодействовать с ними посредством предусмотренных механизмов взаимодействия.
Может случиться так, что в будущем все ваши процессы будут представлять собой оркестровку ранее реализованных модулей, что сводит трудозатраты на реализацию подобных задач к минимуму, все ваше основное внимание будет сосредоточено на организации связей между повторно используемыми компонентами.
Такое межкомпонентное взаимодействие известно под короткой аббревиатурой IPC (Inter Process Communication), которая объединяет различные методы обмена сообщениями и синхронизации данных.
Давайте рассмотрим пример такого взаимодействия.
В Oracle BPM межпроцессные коммуникации объединены в понятие «Разговор», которое используется для определения сценария взаимодействия между участниками общения.
Более того, в качестве участников могут выступать различные компоненты решения, такие как процессы BPMN или BPEL, Human Tasks, Business Rules, внешние по отношению к процессу сервисы.
Существуют различные типы диалогов, которые определяют интерфейс для «связи» вашего процесса с другими процессами или службами; это может быть собственный интерфейс или доступен по умолчанию.
Подробную информацию об этом можно найти в соответствующая документация Oracle .
В нашей демонстрации мы ограничимся обменом данными между двумя процессами, поэтому в нашем случае мы будем использовать интерфейс по умолчанию для межпроцессного взаимодействия: 1. Первый процесс является основным, эмулирует этапы обработки заявки; 2. Второй процесс - вспомогательный, эмулирует запрос дополнительной информации по приложению, который может занять некоторое время и результаты проверки могут понадобиться основному процессу не сразу, а на одном из этапов выполнения.
Как мы видим, в данном сценарии нам необходимо организовать параллельное выполнение 2-х процессов, взаимодействующих друг с другом в режиме выполнения.
Итак, давайте запустим среду JDeveloper и откроем ранее созданный предыдущая статья Приложение «Образцы».
Повторите шаги, чтобы создать его, если у вас его нет. Создадим 2-й процесс, который будет эмулировать работу некоего фонового процесса, эмулирующего активность проверки данных в приложении:
1. Кликните правой кнопкой мыши по проекту «PubSubPr», выберите опцию «Новый» и из галереи выберите шаблон для создания нового процесса «Процесс BPMN 2.0»;
2. В открывшемся окне «Мастера» в качестве имени указать «BackgroundProcess», в качестве типа процесса указать «Асинхронный сервис» (процесс с асинхронным интерфейсом взаимодействия);
3. В качестве входного аргумента процесса (Input) укажите переменную с именем «reqProcess» в качестве типа, укажите QuoteRequest, доступный из публичного примера xsd схемы Quote. Демо-версия предложения по продажам :
4. В качестве выходного аргумента процесса (Output) укажите переменную с именем «checkResult» и укажите тип переменной Boolean;
5. Нажимаем «Готово», на этом этапы создания процесса завершены, далее мы создадим в нем необходимые активности;
6. Создайте переменную процесса checkResult с типом Boolean:
7. Прежде всего, эмулируем выполнение какой-то трудоемкой деятельности; для этого перенесем в процесс активность «Таймер» из палитры компонентов процесса раздела «Перехват событий»;
8. В открывшемся диалоговом окне оставляем название активности по умолчанию и сразу переходим на вкладку «Реализация», здесь указываем период ожидания равный 1 минуте, как на картинке ниже:
9. Опять же, чтобы эмулировать результат выполнения какого-либо действия, переместите действие «Скрипт» из палитры компонентов на диаграмму процесса и в открывшемся окне «Мастера» оставьте имя по умолчанию и перейдите в раздел «Внедрение».
Здесь мы инициализируем переменную процесса значением «true», используя «Ассоциации данных»:
10. Чтобы процесс возвращал ожидаемое значение вызвавшей его стороне, настроим отображение данных активности «Завершение» процесса:
На этом создание вспомогательного процесса завершено.
Теперь внесем необходимые изменения в основной процесс и настроим взаимодействие со вспомогательным.
За основу основного процесса возьмем уже существующий в проекте «PubSubPr» процесс — «Процесс» и выполним последовательно следующие шаги:
1. Измените тип запуска процесса на «Сообщение», определите новый интерфейс для обмена сообщениями и укажите в качестве аргумента переменную quoteRequest с типом «QuoteRequest» и укажите «start» в качестве имени операции:
2. Настройте сопоставление данных переменной аргумента с переменной процесса:
3. Теперь создадим т.н.
«Разговор», который мы в дальнейшем будем использовать для взаимодействия со вспомогательным процессом, в структуре процесса кликаем правой кнопкой мыши по узлу «Разговор» и выбираем «новый».
4. В открывшемся окне даем имя «Процесс_BackgroundProcess» и в качестве типа взаимодействия указываем «Вызов процесса», после чего у нас есть возможность выбрать процесс, который необходимо вызвать, указываем «BackgroundProcess»:
5. Переносим активность «ThrowEvent» в процесс, который будет вызывать наш вспомогательный процесс и в качестве «Разговора» указывать вновь созданный «Process_BackgroundProcess», а в качестве вызываемого узла указывать «Start»:
Затем укажем отображение данных:
6. Теперь передаем процессу активность «CatchEvent», достигнув которой процесс будет ждать результата вспомогательного процесса, в качестве качества «Разговор» указываем «Process_BackgroundProcess», в качестве вызываемого узла указываем «Конец»:
После завершения действий скопируйте результат процесса в переменную процесса checkResult (если она отсутствует, создайте ее):
7. Далее необходимо немного доработать саму схему процесса для эмуляции действий в ней, внести изменения согласно схеме ниже (обратите внимание, что все активности в процессе помечены как «черновики», за это отвечает соответствующий флаг активности).
это – «Черновик»).
Для «условной» ветви, ведущей к задаче «ReviewTask» (выделена красным), укажите условие перехода:
В результате выполненных действий мы получили готовый к тестированию проект, состоящий из 2-х взаимодействующих процессов.
Давайте развернем его на сервере приложений Weblogic, интегрированном в JDeveloper. Для этого кликаем правой кнопкой мыши по нашему проекту «PubSubPr» и выбираем опцию «Выполнить»:
После того, как наше приложение будет развернуто на сервере веб-логики, интегрированном в JDeveloper, мы можем начать тестирование.
Откроем консоль мониторинга системы Enterprise Manager по адресу localhost:7101/em, откроем развернутое приложение — PubSubPr и выберем для тестирования веб-сервис Process.service:
Затем проверим историю запуска экземпляров процесса:
Проверим историю выполнения завершенного экземпляра процесса:
Здесь видно, что в момент прохождения токена процесса активности «ThrowEvent» (в нашем случае время выполнения активности «13:50:14») процесс «BackgroundProcess» (время начала «13:50:15») был асинхронно вызывается:
Затем, выполнив несколько шагов, наш основной процесс «Процесс» ждал 1 минуту, пока «BackgroundProcess» вернет ответ в действии «CatchEvent», после чего продолжил выполнение.
Мы также можем визуально увидеть диаграмму взаимодействия процессов на этапе разработки процесса в JDeveloper. Он доступен на диаграмме BPMN нашей основной модели процесса во вкладке «Совместная работа»:
Теги: #bpm #разговор #события #асинхронный вызов #oracle
-
Устройство Управления Связью
19 Oct, 24 -
Карта Глобальных Катастроф
19 Oct, 24 -
В Шотландии Камеры Следят За Камерами
19 Oct, 24 -
Лаборатория Веб-Телевидения
19 Oct, 24