Если ваши заказчики, внешние или внутренние, еще ни разу не требовали от вас, чтобы вы обеспечили некий определенный способ инициации BPM-процесса, будьте уверены — этот момент не за горами. Вас могут попросить, например, чтобы процесс запускался неким триггером, вроде получения электронного письма, или запроса внешней системы, или событием расписания.
Не буду вас долго мучить — Oracle BPM может и все это, и многое другое. Бизнес-процесс можно запускать веб-сервисом (синхронным или асинхронным вызовом), посредством использования Java Message Service, при помощи 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:
![image](http://habrastorage.org/files/e39/c02/eef/e39c02eefa0940e59f38ffefdbb0ccb3.png)
4. Создадим простой интерактивный процесс без задачи для человека, с одной единственной ролью «Manager»:
![image](http://habrastorage.org/files/a35/c0f/eed/a35c0feed3f24713b38e72bdb2224b85.png)
5. Создадим переменную процесса quoteRequest с типом QuoteRequest:
![image](http://habrastorage.org/files/769/8eb/c3d/7698ebc3dc4242ffb8c15c9b624b6291.png)
6. Изменим тип старта процесса на Signal:
![image](http://habrastorage.org/files/f3d/a7d/f5c/f3da7df5c7954fa9bec4481bd819a558.png)
7. Укажем ранее созданное событие, которое будет инициировать данный процесс:
![image](http://habrastorage.org/files/907/2dd/684/9072dd684dd8492aa7aa384dda912481.png)
8. После чего необходимо создать маппинг данных из полученного события в переменную процесса quoteRequest:
![image](http://habrastorage.org/files/e85/03c/798/e8503c7986654cd2967cb928892f79b7.png)
Теперь приступим к созданию BPEL процесс создающий событие:
1. Откроем файл с составной (композитной) диаграммой — composite.xml, содержащий наш BPMN процесс:
![image](http://habrastorage.org/files/128/ef8/972/128ef89724954d48a5b3182ffd150b0b.png)
2. Переместим на неё BPEL-компоненту, в открывшемся «Мастере» присвоим наименование QuoteRequestEventService и выставим значения согласно иллюстрации приведенной ниже:
![image](http://habrastorage.org/files/114/9b7/8cd/1149b78cdbe1484db25ae45e5f52433f.png)
3. Перенесем активность invoke на процесс и в качестве Interaction Type укажем как Event, в качестве события укажем ранее созданное событие QuoteRequestEvent, в качестве переменной укажем RaiseQuoteRequestEvent_InputVariable она же фактически будет являться переменной нашего процесса:
![image](http://habrastorage.org/files/145/522/b9b/145522b9bb8c4c6dbd8eb9b840ac8abe.png)
4. Для того чтобы была возможность инициализировать наше событие с входными данными, поставим перед активностью с событием активность типа Assign, создадим соответствующий маппинг данных:
![image](http://habrastorage.org/files/d2e/032/6fe/d2e0326fe4864c25ae3f63ab5f28c476.png)
Для того чтобы протестировать созданное приложение запустим сервер приложений Weblogic внутри самого JDeveloper:
![image](http://habrastorage.org/files/bfa/6f0/bfb/bfa6f0bfb32142e8ba9de82b3f2a67c7.png)
Более подробную информацию об интегрированном в JDeveloper сервере приложений Weblogic вы можете получить по следующей ссылке.
После запуска сервера разверем наше приложение на запущенном сервере, с помощью созданного по-умолчанию деплоймент дескриптора:
![image](http://habrastorage.org/files/ad2/dba/c32/ad2dbac32e4d4580b7f963d865edc6b6.png)
Для демонстрации работы нашего приложения нам понадобится Enterprise Manager, который доступен нам по ссылке localhost:7101/em, откроем развернутое приложение — PubSubPr и выберем для тестирования web-сервис quoterequesteventservice_client_ep:
![image](http://habrastorage.org/files/7af/7f6/1f4/7af7f61f4cc14b72975d906e34ce50d2.png)
После чего проверим историю запущенных инстансов процесса:
![image](http://habrastorage.org/files/39e/542/6ae/39e5426ae4fe471fb4cfe1e110e01d4c.png)
Как мы видим наш процесс был застартован посредством события:
Не буду вас долго мучить — Oracle BPM может и все это, и многое другое. Бизнес-процесс можно запускать веб-сервисом (синхронным или асинхронным вызовом), посредством использования Java Message Service, при помощи API BPM Process Engine, сообщением электронной почты, наступлением определенного момента времени по таймеру, а также по подписке на определенные события, причем независимо от того, какой интерфейс использует система источника сообщений.
![image](http://habrastorage.org/files/cbe/5b3/9bd/cbe5b39bd9f6415eb4b6dcf40c45e8eb.png)
В некоторых интеграционных средах важно максимально полно абстрагироваться от непосредственного взаимодействия с сервисами конечных систем. В таких случаях обмен сообщениями между ними может происходить посредством событийного механизма. Событие, в таком случае, возникает как результат некоторого действия, например, получение письма, регистрация обращения клиента, завершение одного из этапов обработки клиентских данных и имеет под собой определенный тип сообщения с данными. Это сообщение, в свою очередь, регистрируется или публикуется в соответствующей инфраструктуре, которая отвечает за его дальнейшую доставку всем заинтересованным адресатам. Для того, чтобы система могла получить сообщение в качестве адресата, ей необходимо иметь подписку на событие, которое использует данный тип сообщения. Т.о. мы можем сколько угодно добавлять подписчиков, совершенно не заботясь об интеграционном интерфейсе системы источника сообщений.
В интеграционной платформе 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:
![image](http://habrastorage.org/files/e39/c02/eef/e39c02eefa0940e59f38ffefdbb0ccb3.png)
4. Создадим простой интерактивный процесс без задачи для человека, с одной единственной ролью «Manager»:
![image](http://habrastorage.org/files/a35/c0f/eed/a35c0feed3f24713b38e72bdb2224b85.png)
5. Создадим переменную процесса quoteRequest с типом QuoteRequest:
![image](http://habrastorage.org/files/769/8eb/c3d/7698ebc3dc4242ffb8c15c9b624b6291.png)
6. Изменим тип старта процесса на Signal:
![image](http://habrastorage.org/files/f3d/a7d/f5c/f3da7df5c7954fa9bec4481bd819a558.png)
7. Укажем ранее созданное событие, которое будет инициировать данный процесс:
![image](http://habrastorage.org/files/907/2dd/684/9072dd684dd8492aa7aa384dda912481.png)
8. После чего необходимо создать маппинг данных из полученного события в переменную процесса quoteRequest:
![image](http://habrastorage.org/files/e85/03c/798/e8503c7986654cd2967cb928892f79b7.png)
Теперь приступим к созданию BPEL процесс создающий событие:
1. Откроем файл с составной (композитной) диаграммой — composite.xml, содержащий наш BPMN процесс:
![image](http://habrastorage.org/files/128/ef8/972/128ef89724954d48a5b3182ffd150b0b.png)
2. Переместим на неё BPEL-компоненту, в открывшемся «Мастере» присвоим наименование QuoteRequestEventService и выставим значения согласно иллюстрации приведенной ниже:
![image](http://habrastorage.org/files/114/9b7/8cd/1149b78cdbe1484db25ae45e5f52433f.png)
3. Перенесем активность invoke на процесс и в качестве Interaction Type укажем как Event, в качестве события укажем ранее созданное событие QuoteRequestEvent, в качестве переменной укажем RaiseQuoteRequestEvent_InputVariable она же фактически будет являться переменной нашего процесса:
![image](http://habrastorage.org/files/145/522/b9b/145522b9bb8c4c6dbd8eb9b840ac8abe.png)
4. Для того чтобы была возможность инициализировать наше событие с входными данными, поставим перед активностью с событием активность типа Assign, создадим соответствующий маппинг данных:
![image](http://habrastorage.org/files/d2e/032/6fe/d2e0326fe4864c25ae3f63ab5f28c476.png)
Для того чтобы протестировать созданное приложение запустим сервер приложений Weblogic внутри самого JDeveloper:
![image](http://habrastorage.org/files/bfa/6f0/bfb/bfa6f0bfb32142e8ba9de82b3f2a67c7.png)
Более подробную информацию об интегрированном в JDeveloper сервере приложений Weblogic вы можете получить по следующей ссылке.
После запуска сервера разверем наше приложение на запущенном сервере, с помощью созданного по-умолчанию деплоймент дескриптора:
![image](http://habrastorage.org/files/ad2/dba/c32/ad2dbac32e4d4580b7f963d865edc6b6.png)
Для демонстрации работы нашего приложения нам понадобится Enterprise Manager, который доступен нам по ссылке localhost:7101/em, откроем развернутое приложение — PubSubPr и выберем для тестирования web-сервис quoterequesteventservice_client_ep:
![image](http://habrastorage.org/files/7af/7f6/1f4/7af7f61f4cc14b72975d906e34ce50d2.png)
После чего проверим историю запущенных инстансов процесса:
![image](http://habrastorage.org/files/39e/542/6ae/39e5426ae4fe471fb4cfe1e110e01d4c.png)
Как мы видим наш процесс был застартован посредством события:
![image](http://habrastorage.org/files/796/5e2/f11/7965e2f11fb5401d8c5b47ca89bd4d1e.png)
sllh
Перевод из хелпа оракла, конечно, очень полезен. Рассказали бы лучше про какие-нибудь трики вещи, вроде distributed transaction, compensation processes, dehydration points.
ruslan_ilin Автор
спасибо за внимание! статья носит обзорный характер возможностей Oracle BPM в части событийного механизма, обозначенные вами темы весьма интересны для обзора, возьмем их на заметку для будущих статей