Межпроцессное взаимодействие

Реализация межпроцессного взаимодействия в системе RunaWFE

Общая информация

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

До версии 4.3.0 в RunaWFE для межпроцессного взаимодействия использовались элементы «Отправить/Получить сообщение», близкими аналогами которых в BPMN являются сигналы и сообщения.

Mes elements ru.png

В настоящий момент данные элементы заменены (с поддержкой обратной совместимости) на события обработки и генерации (Генерация и обработка событий)

Для отправки и получения сообщений используется технология JMS. Узел-отправитель посылает сообщение сразу после прихода в него точки управления, после этого точка управления перемещается в следующий узел, а узел-получатель ожидает сообщения, и точка управления может находиться в этом узле неопределенно долго.

Параметры сообщений

В сообщении содержится следующая информация:

  • кому предназначено сообщение
  • передаваемые значения переменных бизнес-процесса

В некоторых случаях одно сообщение может быть обработано несколькими получателями.
Адресат сообщения может быть определен следующим образом:

  • по названию бизнес-процесса (processDefinitionName)
  • по названию узла бизнес-процесса (processNodeName)
  • по идентификатору экземпляра бизнес-процесса (processInstanceId)

Для задания этих параметров можно использовать:

  • переменные экземпляра бизнес-процесса, например, processDefinitionName=${proc_name}, где proc_name – это переменная содержащая название процесса
  • константное значение, например processNodeName = SimpleProc, где SimpleProc это название процесса
  • предопределенные значения:по названию текущего определения процесса ( ${currentDefinitionName} ) по названию текущего узла ( ${currentNodeName} ) по номеру текущего экземпляра процесса ( ${currentInstanceId} )

Структура данных сообщения позволяет задавать соответствие между переменными отправителя и получателя на любой из сторон (или с обеих сторон).
Ниже показан пример настройки узла получателя сообщения:

Mes ex ru.png

Здесь имеем свойство маршрутизации по текущему названию процесса, а также установлено следующее соответствие между переменными: переменная процесса Str2 получит значение переменной Str1 из сообщения, а также id_proc получит значение переменной id_inst

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

Если, наоборот, существует сразу несколько выполняющихся экземпляров этого бизнес-процесса, то сообщение будет передано сразу всем этим экземплярам.

Простой пример процессов с межпроцессным взаимодействием

Сценарий процессов

В данном разделе рассматриваются простые процессы, показывающие механизм межпроцессного взаимодействия в системе Runa WFE, реализованный при помощи сообщений.
SimpleMessageSend отправляет в сообщении введённые пользователем данные в процесс SimpleMessageReceive, используется маршрутизация “по названию процесса”.
SimpleMessageReceive получает данные и отображает их на форме.

Разработка графа

Создайте новый проект, затем кликните левой кнопкой мыши на команду «Новый процесс». Введите в появившемся диалоге “ SimpleMessageSend” в качестве имени процесса. Для данного процесса используем язык JPDL.

Mes simple ru1 1.png

Аналогично создайте процесс SimpleMessageReceive.

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

Mes simple ru2.png

Здесь используется следующие элементы: “Начало”, “Окончание”, “Узел действие” и узел “Отправить сообщение”
Для задания подписи элемента отличной от подписи по-умолчанию, выделите элемент кликнув на него, и еще раз кликните на элементе.

Для процесса SendMessageReceive нарисуйте следующий граф:

Mes simple ru3.png

В отличии от SimpleMessageSend, здесь используется элемент “Получить сообщение”, необходимы для получения данных.

Роли

Описание ролей

В разрабатываемых процессах используются следующие Роли:

  • manager, используется в процессе SimpleMessageSend, будет инициализирована пользователем, запустившим процесс.
  • staff, используется в процессе SimpleMessageReceive, имеет инициализатор и будет проинициализирована пользователем из группы staff, запустившим процесс:

Mes simple ru4.png

Создание переменных

Описание и инициализация переменных

В процессе SimpleMessageSend используется переменная типа Строка – “msg_send”, предназначенная для отправки в сообщении. Переменная инициализируется значением введённым пользователем в узле “Ввод данных”, а затем передаётся в процесс SimpleMessageReceive с помощью механизма сообщений.

В процессе SimpleMessageReceive используетя переменная “msg_rec” также формата Строка, принимает значение в сообщении от SimpleMessageSend

Создание переменных

Кликните на вкладке «Переменные». Кликните на кнопке «Создать»

Mes simple ru5.png

Введите название переменной – msg_send, в качестве формата выберите Строка.

Mes simple ru6 1.png

Аналогично создаётся переменная msg_rec в процессе SimpleMessageReceive

Создание графических форм

Создание графических форм при помощи конструктора форм

Кликните на узел «Ввод данных» графа процесса SimpleMessageSend правой кнопкой мыши и выберите команду «Форма» > «Создать форму» (левой кнопкой мыши):

Mes simple ru7.png

В появившимся выпадающем списке выберите тип формы «HTML форма + freemarker теги»
Появится форма, на которую необходимо поместить тег InputVariable для ввода значения в переменную msg_send:

Mes simple ru8 1.png

В процессе SimpleMessageReceive создаём форму в узле “Вывод данных”, процесс создания аналогичен вышеописанному примеру. На форме необходимо расположить FTL тег “DisplayVariable” для вывода значения переменной msg_rec:

Mes simple ru9 1.png

Задание проверок значений, введенных в элементы форм (валидация)

В процессе SimpleMessageSend необходимо задать проверку переменной msg_send, выбрав валидатор “Обязательное поле”. Для этого кликните правой клавишей мыши на узле ввод данных, и в появившейся форме выберите «Переменные формы (валидация)»:

Mes simple ru10.png

В появившейся форме будет отображена переменная msg_send. Для выбранного поля в окне «Валидаторы» необходимо установить валидатор “Обязательное поле”, и ввести текст сообщения об ошибке:

Mes simple ru11.png

Настройка межпроцессного взаимодействия

Настройка отправителя

В процессе SimpleMessageSend необходимо настроить отправку сообщения, для этого кликните правой клавишей мыши на узле “Отправить данные” и выберите пункт “отправить сообщение”:

Mes simple ru12.png

На появившейся форме необходимо добавить свойства маршрутизации, а также данные пересылаемые в сообщении:

Mes simple ru13.png

Используем отправку “По названию процесса”, для этого необходимо кликнуть на соответствующую кнопку и ввести название процесса, в данном случае SimpleMessageReceive

Mes simple ru14.png

Далее необходимо задать переменные, которые будут отправлены в сообщении. Для этого кликните на кнопку “добавить”, расположенную внизу формы, и выберите переменную msg_send. Также здесь есть возможность задать имя, под которым данная переменная будет в сообщении:

Mes simple ru15.png

Получаем следующие настройки:

Mes simple ru16.png

Настройка получателя

В процессе SimpleMessageReceive необходимо настроить параметры получения сообщения, для этого кликните правой клавишей мыши на узле “Получить данные” и выберите пункт “получить сообщение”:

Mes simple ru17.png

На появившейся форме необходимо добавить свойства маршрутизации, а также соответствие переменных для получения данных. Используем получение по “По названию процесса”, для этого необходимо кликнуть на соответствующую кнопку, в результате в свойствах появится: processDefinitionName = ${currentDefinitionName}

Mes simple ru18.png

где currentDefinitionName указывает на текущее название процесса

Также необходимо добавить переменные принимаемые в сообщении, для этого нажмите кнопку “добавить” внизу формы и выберите название переменной msg_rec

Mes simple ru19.png

Затем в поле названия переменной в сообщении необходимо вписать msg_send

Mes simple ru20.png

Таким образом, мы установили соответствие между посылаемой в сообщении переменной msg_send процесса SimpleMessageSend и переменной msg_rec в процессе simpleMessageReceive.
Получаем следующие настройки:

Mes simple ru21.png

Создание файла-архива бизнес-процесса и загрузка его в систему

Последовательность действий полностью повторяет последовательность, описанную для других бизнес-процессов, например «HelloWorldProcess».
Также после загрузки необходимо настроить обладателей полномочий на данные процессы:
Для SimpleMessageSend нужно добавить в обладатели полномочий группу manager

Mes simple ru22.png

А для SimpleMessageReceive группу staff:

Mes simple ru23.png

Выполнение процессов

Краткое описание процесса взаимодействия

Процессы SimpleMessageSend и SimpleMessageReceive показывают простой пример механизма межпроцессного взаимодействия реализованный при помощи сообщений.

Пользователь запускает экземпляр процесса SimpleMessageSend, вводит текст отправляемого сообщения, после чего происходит отправка в экземпляры процесса SimpleMessageReceive. Процесс SimpleMessageSend переходит в состояние “завершения”.

Пользователь, принадлежащий группе staff, запускает экземпляр процесса SimpleMessageReceive, после чего управление останавливается на узле “Получить данные”, ожидая данные.

Сообщение приходит во все экземпляры SimpleMessageReceive, где полученное значение переменной (текст сообщения) отображается на форме, после чего экземпляры SimpleMessageReceive также завершаются.

Рассмотрим два примера выполнения разработанного взаимодействия

Один получатель

Для запуска процесса SimpleMessageReceive необходимо войти под пользователем из группы staff, и кликнуть на название данного процесса в общем списке процессов:

Mes simple ru24.png

Запустится экземпляр процесса, и управление остановится на узле “Получить данные” ожидая сообщение

Mes simple ru25.png

Далее пользователь входящий в группу manager (например julius) запускает экземпляр процесса SimpleMessageSend, вводит текст посылаемого сообщения:

Mes simple ru26.png

Экземпляр процесса SimpleMessageSend завершается.

При этом экземпляр процесса SimpleMessageReceive, получает сообщение и управление переходит в узел “Вывод данных”,

Mes simple ru27.png

пользователь attila видит присланное сообщение на форме:

Mes simple ru28.png

Ниже приведена история выполнения описанных процессов:

Mes simple ru29.png

Mes simple ru30.png

Несколько получателей

Второй рассматриваемый пример взаимодействия – это отправка сообщения сразу нескольким экземплярам SimpleMessageReceive

Запустим экземпляры процесса SimpleMessageReceive под всеми пользователями входящими в группу staff:

  • Attila
  • Gaiua
  • Marcus

Mes simple ru31.png

Далее запускаем экземпляр процесса SimpleMessageSend под пользователем входящим в группу manager, как и в первом примере вводим сообщение “Hello World!!!”

Mes simple ru32.png

После чего сообщение придёт сразу во все ожидающие его экземпляры SimpleMessageReceive

История выполнения:

Mes simple ru33.png

Mes simple ru34.png

Mes simple ru35.png

Mes simple ru36.png

Mes simple ru37.png

Пример сложного процесса взаимодействия с помощью сообщений

Сценарий процессов

В данном разделе рассматриваются процессы, показывающие механизм межпроцессного взаимодействия в системе Runa WFE, реализованный при помощи сообщений.

MessageQuery отправляет сообщение в процесс MessageResponse, используется маршрутизация “по названию процесса”. В качестве данных пересылаемых в сообщении используется введённая пользователем строка, а также id экземпляра процесса MessageQuery

MessageResponse получает данные, пользователь изменяет полученное значение строки, и высылает сообщение обратно в процесс MessageQuery, при этом используется маршрутизация “по ID процесса”

Разработка графа

Создайте новый проект, затем кликните левой кнопкой мыши на команду «Новый процесс». Введите в появившемся диалоге “ MessageQuery ” в качестве имени процесса. Данный процесс разработаем на языке BPMN.

Mes query ru1 1.png

Аналогично создайте процесс MessageResponse.

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

Mes query ru2 1.png

Здесь используется следующие элементы: “Начало”, “Окончание”, “Узел действие”, “Отправить сообщение”/“Получить сообщение”, а также “Задача сценария”

Для задания подписи элемента отличной от подписи по-умолчанию, выделите элемент кликнув на него, и еще раз кликните на элементе.
Аналогично нарисуйте граф для процесса MessageResponse следующего вида:

Mes query ru3 1.png

Т.е. как видно из графов, в обоих процессах используется элементы отправки и принятия сообщений, в отличии от процессов SimpleMessage.

Роли

Описание ролей

В разрабатываемых процессах используются следующие Роли:

  • manager, используется в процессе MessageQuery, будет инициализирована пользователем, запустившим процесс.
  • staff, используется в процессе MessageResponse, будет инициализирована пользователем, запустившим процесс.

Создание переменных

Описание переменных

В процессе MessageQuery используются следующие переменные:

  • str_query, это переменная типа Строка, которую вводит пользователь в узле “Ввод данных” и отправляет в экземпляры процесса MessageResponse
  • id_query, это переменная типа Строка, содержит id экземпляра процесса MessageQuery, также отправляется в сообщении. Данная переменная должна быть проинициализирована в задаче сценария “get instance id” с помощью обработчика ExecuteFormulaActionHandler

В процессе MessageResponse используются следующие переменные:

  • str_response, это переменная типа Строка, которую процесс получает из присланного сообщения, обрабатывает и отправляет обратно в экземпляр MessageQuery
  • id_query, это переменная типа Строка, содержит id экземпляра процесса MessageQuery. Принимает значение из сообщения, и необходима для определения получателя, т.е. используется в свойствах маршрутизации.

Создание переменных

Кликните на вкладке «Переменные». Кликните на кнопке «Создать», введите название переменной – str_query, в качестве формата выберите Строка.

Mes query ru4 1.png

Аналогично создаётся переменная str_response в процессе MessageResponse
Также необходимо создать переменные id_query в соответствующих процессах:

Mes query ru5 1.png

Mes query ru6 1.png

Создание обработчиков

В процессе MessageQuery необходимо создать обработчик ExecuteFormulaActionHandler, в котором определить id данного экземпляра и проинициализировать полученным значением переменную id_query
Для этого выделите узел задачу сценария,

Mes query ru7 1.png

Затем выберите класс обработчика – ExecuteFormulaActionHandler, и задайте конфигурацию обработчика:

Mes query ru8.png

где get_instance_id() – это функция возвращающая id экземпляра процесса

Создание графических форм

Создание графических форм при помощи конструктора форм

Кликните на узел «Ввод данных» графа процесса MessageQuery правой кнопкой мыши и выберите команду «Форма» > «Создать форму» (левой кнопкой мыши):

Mes query ru9 1.png

В появившимся выпадающем списке выберите тип формы «HTML форма + freemarker теги»
Появится форма, на которую необходимо поместить тег InputVariable для ввода значения в переменную str_query:

Mes query ru10 1.png

В процессе MessageResponse также создаём форму в узле “Ввод данных”, процесс создания аналогичен вышеописанному примеру. На форме необходимо расположить тег InputVariable для редактирования значения переменной str_response.

Также необходимо создать форму для отображения значения переменной после взаимодействия между процессами.

Кликните на узел «Вывод данных» графа процесса MessageQuery правой кнопкой мыши и выберите команду «Форма» > «Создать форму» (левой кнопкой мыши), после чего расположите на форме FTL тег “DisplayVariable” для str_query.

Настройка межпроцессного взаимодействия

Настройка отправителя в процессе MessageQuery

Для настройки отправки кликните правой клавишей мыши на элементе “отправить сообщение”, и выберите одноименный пункт меню:

Mes query ru13 1.png

В свойствах маршрутизации укажите следующие настройки:

Mes query ru14.png

Т.е. отправляем переменные id_query и str_query в процесс MessageResponse (отправка по названию процесса)

Настройка получателя в процессе MessageResponse

Для настройки кликните правой клавишей мыши на элементе “получить сообщение”, и выберите одноименный пункт меню:

Mes query ru15.png

В свойствах маршрутизации укажите следующие настройки:

Mes query ru16.png

т.е. принимаем значение переменной id_query из сообщения в переменную id_query экземпляра процесса MessageResponse, а значение str_query в переменную str_response

Настройка отправителя в процессе MessageResponse

После получения и обработки сообщения, процесс MessageResponse возвращает обработанные данные в экземпляр процесса MessageQuery, для этого используются следующие настройки:

Mes query ru17.png

Добавляем свойство маршрутизации:

Mes query ru18.png

что подразумевает выбор получателя по id экземпляра процесса, значение id хранится в переменной id_query

Добавляем переменные:

Mes query ru19.png

Получаем:

Mes query ru20.png

Настройка получателя в процессе MessageQuery

Обработанные в MessageResponse данные возвращаются в MessageQuery, для принятия этих данных необходимо настроить элемент “Принять сообщение” следующим образом:

Mes query ru21.png

Свойство маршрутизации задаём как processInstanceId = ${currentInstanceId}, т.е. по id процесса, а соответствие переменных устанавливаем как str_query=str_response, т.е. присланное в переменной str_response значение сохраняем в переменную str_query

Создание файла-архива бизнес-процесса и загрузка его в систему

Загружаем разработанные процессы в систему, используя пункт меню “Файл/Экспорт процесса”, экспортируем непосредственно на WFE сервер.
Также после загрузки необходимо настроить обладателей полномочий на данные процессы:
Для MessageQuery нужно добавить в обладатели полномочий группу manager, а для MessageResponse группу staff

Выполнение процессов

Описание процесса взаимодействия

Пользователь запускает экземпляр процесса MessageQuery, вводит текст отправляемого сообщения в переменную str_query. В этом же узле срабатывает обработчик, в котором определяется id данного экземпляра процесса. Затем происходит отправка сообщения в экземпляр процесса MessageResponse, передаются значения переменных str_query и id_query. Процесс MessageQuery переходит в следующий узел, ожидая сообщения с результатом обработки.

Пользователь, принадлежащий группе staff, запускает экземпляр процесса MessageResponse, сразу после старта управление останавливается на узле “Получить сообщение”, ожидая данные. После получения сообщения, происходит выборка данных в переменные str_response и id_query. Далее управление переходит в узел “Ввод данных”, где пользователь редактирует значение переменной str_response. Затем происходит отправка отредактированного значения обратно в экземпляр MessageQuery, при этом используется полученное ранее значение id этого экземпляра.
MessageQuery получает из сообщения значение str_query и переходит в узел “Вывод данных”

выполнение процессов по шагам

Для запуска процесса MessageQuery необходимо войти под пользователем из группы manager, и кликнуть на название данного процесса в общем списке процессов:

Mes query ru22.png

Стартует новый экземпляр процесса, управление переходит в узел “Ввод данных”

Mes query ru23.png

Вводим текст сообщения для отправки, например: “Hello”

Mes query ru24.png

Далее происходит определение id данного экземпляра процесса и отправка сообщения, содержащего переменные str_query и id_query.

Mes query ru25.png

Управление переходит в “Принять сообщение”, здесь оно будет находиться до тех пор, пока не получит сообщение от процесса MessageResponse

Mes query ru26.png

Запускаем экземпляр процесса MessageResponse, для этого входим в систему под пользователем входящим в группу staff

Mes query ru27.png

После запуска, управление останавливается на узле ожидания сообщения

Mes query ru28.png

После получения сообщения, управление переходит в узел ввода данных:

Mes query ru29.png

Mes query ru30.png

Здесь пользователь дополняет полученное сообщение:

Mes query ru31.png

Mes query ru32.png

Далее происходит отправка сообщения (Hello World!!!), в экземпляр процесса выбранного по id, после чего процесс MessageResponse завершается:

Mes query ru33.png

Процесс MessageQuery получает сообщение, содержащее переменную str_response, переменная str_query инициализируется значением Hello World!!!, и выводится на форму узла “Вывод данных”

Mes query ru34.png

Mes query ru35.png

Процесс завершается:

Mes query ru36.png

Короткое техническое описание

Описание