[Из песочницы] Реализация событийного механизма в Oracle BPM
В качестве бизнес-требований к реализации BPM процесса, какую-бы он логику не выполнял, часто выступают различные способы его инициации. В частности, это могут быть требования на запуск процесса от имени человека с определенными полномочиями (ролью) в результате запроса внешней системы по расписанию, или же старт по наступлению определенного события (например, получение почты, файла, заявки).Oracle BPM, в таких случаях, предоставляет полный спектр возможностей старта процесса и в зависимости от того, какие технологические интерфейсы он реализует, запуск возможен посредством web-сервиса (синхронный или асинхронный вызов), JMS (гарантированная доставка сообщения), e-mail, таймера, использования API BPM Process Engine или же по подписке на определенные события.В некоторых интеграционных средах важно максимально полно абстрагироваться от непосредственного взаимодействия с сервисами конечных систем. В таких случаях обмен сообщениями между ними может происходить посредством событийного механизма. Событие, в таком случае, возникает как результат некоторого действия, например, получение письма, регистрация обращения клиента, завершение одного из этапов обработки клиентских данных и имеет под собой определенный тип сообщения с данными. Это сообщение, в свою очередь, регистрируется или публикуется в соответствующей инфраструктуре, которая отвечает за его дальнейшую доставку всем заинтересованным адресатам. Для того, чтобы система могла получить сообщение в качестве адресата, ей необходимо иметь подписку на событие, которое использует данный тип сообщения. Т.о. мы можем сколько угодно добавлять подписчиков, совершенно не заботясь об интеграционном интерфейсе системы источника сообщений.
В интеграционной платформе Oracle в качестве инфраструктуры для публикации событий и доставки сообщений адресатам выступает платформа Event Delivery Network (EDN). По следующей ссылке вы можете получить подробную информацию о данной платформе. В нашем примере мы используем её возможности для инициации процесса посредством события.
В данной статье я продемонстрирую как можно реализовать данный подход с помощью технологий Oracle. Для этого нам понадобится развернуть среду разработки текущего релиза 12c на своей машине. Отмечу, что с появлением данного релиза это сделать достаточно просто. С помощью одного лишь мастера установки вы сможете развернуть среду разработки, БД и сервер с инфраструктурой необходимой для работы BPM. По следующей ссылке вы можете скачать сам установочный пакет и подробную инструкцию для развертывания среды.
В Oracle BPM событийность реализуется посредством активности Signal, которая на самом деле имеет несколько больший диапазон применения, нежели только инициалиция процесса. В целом данная активность обеспечивает событийую модель обмена сообщениями между процессами и в зависимости от контекста может выполнять следующие роли:
1. Запуск BPMN процесса (Start Events) — процесс стартует по мере наступления определенного типа события;2. Трансляция события по ходу работы процесса (Throw Events) — событие публикуется на платформе EDN, в последующем EDN доставляет событие всем подписанным на него подписчикам;3. Захват события (Catch Events) — в данном случае поток выполнения процесса будет ждать появления события на которое он подписан, подобная модель поведения может быть применима когда требуется реализовать обмен сообщениями между несколькими выполняющимися процессами, более подробную информацию об этом можно найти по этой ссылке;4. Трансляция события в момент завершения процесса (End Events) — событие публикуется на платформе EDN в момент завершения процесса.
В нашем случае мы будем использовать Signal в контексте запуска BPMN процесса. Для работы нашего примера необходимо два процесса:
транслятор события, слушатель события Соответственно, в качестве первого процесса — транслятора, создадим процесс в аннотации BPEL, а в качестве 2-го процесса создадим BPMN процесс.Для начала реализуем процесс-подписчик на событие. Откроем JDeveloper и создадим BPM приложение (выберите из галереи шаблон «BPM Application»): в качестве имени приложения укажите «Samples», в качестве имени проекта — «PubSubPr» (в дальнейшем мы будем использовать этот тестовый пример и в других статьях посвященных Oracle BPM). Следующим шагом нам необходимо определить наше событие:
1. Правой кнопкой мыши щелкнем по проекту «PubSubPr», выберем опцию «New» и из галереи выберем шаблон Event Definition (Service Components);2. В открывшемся окне «Мастера» в качестве имени укажем «SampleEvent»;3. С помощью зеленого плюса добавим схему данных нашего события, назовем её QuoteRequestEvent, в качестве схемы данных выберем тип QuoteRequest, доступной из xsd схемы Quote общедоступного примера Sales Quote Demo:
4. Создадим простой интерактивный процесс без задачи для человека, с одной единственной ролью «Manager»:
5. Создадим переменную процесса quoteRequest с типом QuoteRequest:
6. Изменим тип старта процесса на Signal:
7. Укажем ранее созданное событие, которое будет инициировать данный процесс:
8. После чего необходимо создать маппинг данных из полученного события в переменную процесса quoteRequest:
Теперь приступим к созданию BPEL процесс создающий событие:
1. Откроем файл с составной (композитной) диаграммой — composite.xml, содержащий наш BPMN процесс:
2. Переместим на неё BPEL-компоненту, в открывшемся «Мастере» присвоим наименование QuoteRequestEventService и выставим значения согласно иллюстрации приведенной ниже:
3. Перенесем активность invoke на процесс и в качестве Interaction Type укажем как Event, в качестве события укажем ранее созданное событие QuoteRequestEvent, в качестве переменной укажем RaiseQuoteRequestEvent_InputVariable она же фактически будет являться переменной нашего процесса:
4. Для того чтобы была возможность инициализировать наше событие с входными данными, поставим перед активностью с событием активность типа Assign, создадим соответствующий маппинг данных:
Для того чтобы протестировать созданное приложение запустим сервер приложений Weblogic внутри самого JDeveloper:
Более подробную информацию об интегрированном в JDeveloper сервере приложений Weblogic вы можете получить по следующей ссылке.
После запуска сервера разверем наше приложение на запущенном сервере, с помощью созданного по-умолчанию деплоймент дескриптора:
Для демонстрации работы нашего приложения нам понадобится Enterprise Manager, который доступен нам по ссылке localhost:7101/em, откроем развернутое приложение — PubSubPr и выберем для тестирования web-сервис quoterequesteventservice_client_ep:
После чего проверим историю запущенных инстансов процесса:
Как мы видим наш процесс был застартован посредством события: