MessagesGuide
Межпроцессное взаимодействие
Версия 4.6.0
© 2015-2023, ООО "Процессные технологии"
Реализация межпроцессного взаимодействия в системе RunaWFE
Общая информация
В RunaWFE межпроцессное взаимодействие реализовано при помощи сообщений. В соответствии с этой концепцией экземпляр бизнес-процесса может послать сообщение из одного узла схемы бизнес-процесса узлу другого экземпляра бизнес-процесса, или другому узлу того же самого экземпляра бизнес-процесса.
До версии 4.3.0 в RunaWFE для межпроцессного взаимодействия использовались элементы "Отправить/Получить сообщение", близкими аналогами которых в BPMN являются сигналы и сообщения.
В настоящий момент данные элементы заменены (с поддержкой обратной совместимости) на события обработки и генерации (Генерация и обработка событий)
Для отправки и получения сообщений используется технология JMS. Узел-отправитель посылает сообщение сразу после прихода в него точки управления, после этого точка управления перемещается в следующий узел, а узел-получатель ожидает сообщения, и точка управления может находиться в этом узле неопределенно долго.
Параметры сообщений
В сообщении содержится следующая информация:
- кому предназначено сообщение
- передаваемые значения переменных бизнес-процесса
В некоторых случаях одно сообщение может быть обработано несколькими получателями. Адресат сообщения может быть определен следующим образом:
- по названию бизнес-процесса (processDefinitionName)
- по названию узла бизнес-процесса (processNodeName)
- по идентификатору экземпляра бизнес-процесса (processInstanceId)
Для задания этих параметров можно использовать:
- переменные экземпляра бизнес-процесса, например, processDefinitionName=${proc_name}, где proc_name – это переменная содержащая название процесса
- константное значение, например processNodeName = SimpleProc, где SimpleProc это название процесса
- предопределенные значения:по названию текущего определения процесса ( ${currentDefinitionName} ) по названию текущего узла ( ${currentNodeName} ) по номеру текущего экземпляра процесса ( ${currentInstanceId} )
Структура данных сообщения позволяет задавать соответствие между переменными отправителя и получателя на любой из сторон (или с обеих сторон). Ниже показан пример настройки узла получателя сообщения:
Здесь имеем свойство маршрутизации по текущему названию процесса, а также установлено следующее соответствие между переменными: переменная процесса Str2 получит значение переменной Str1 из сообщения, а также id_proc получит значение переменной id_inst
Если сообщение послано по названию бизнес-процесса, а выполняющихся экземпляров этого бизнес-процесса не существует, то сообщение будет ждать появления первого экземпляра этого бизнес-процесса и передаст значения своих параметров первому появившемуся экземпляру в узле «Получить сообщение».
Если, наоборот, существует сразу несколько выполняющихся экземпляров этого бизнес-процесса, то сообщение будет передано сразу всем этим экземплярам.
Простой пример процессов с межпроцессным взаимодействием
Сценарий процессов
В данном разделе рассматриваются простые процессы, показывающие механизм межпроцессного взаимодействия в системе Runa WFE, реализованный при помощи сообщений. SimpleMessageSend отправляет в сообщении введённые пользователем данные в процесс SimpleMessageReceive, используется маршрутизация “по названию процесса”. SimpleMessageReceive получает данные и отображает их на форме.
Разработка графа
Создайте новый проект, затем кликните левой кнопкой мыши на команду «Новый процесс». Введите в появившемся диалоге “ SimpleMessageSend” в качестве имени процесса. Для данного процесса используем язык JPDL.
Аналогично создайте процесс SimpleMessageReceive.
Сделайте двойной клик на появившейся строке «SimpleMessageSend». Появится окно диаграммы бизнес-процесса. Выбирая элементы палитры, нарисуйте следующий граф бизнес-процесса:
Здесь используется следующие элементы: “Начало”, “Окончание”, “Узел действие” и узел “Отправить сообщение” Для задания подписи элемента отличной от подписи по-умолчанию, выделите элемент кликнув на него, и еще раз кликните на элементе.
Для процесса SendMessageReceive нарисуйте следующий граф:
В отличии от SimpleMessageSend, здесь используется элемент “Получить сообщение”, необходимы для получения данных.
Роли
Описание ролей
В разрабатываемых процессах используются следующие Роли:
- manager, используется в процессе SimpleMessageSend, будет инициализирована пользователем, запустившим процесс.
- staff, используется в процессе SimpleMessageReceive, имеет инициализатор и будет проинициализирована пользователем из группы staff, запустившим процесс:
Создание переменных
Описание и инициализация переменных
В процессе SimpleMessageSend используется переменная типа Строка – “msg_send”, предназначенная для отправки в сообщении. Переменная инициализируется значением введённым пользователем в узле “Ввод данных”, а затем передаётся в процесс SimpleMessageReceive с помощью механизма сообщений.
В процессе SimpleMessageReceive используетя переменная “msg_rec” также формата Строка, принимает значение в сообщении от SimpleMessageSend
Создание переменных
Кликните на вкладке «Переменные». Кликните на кнопке «Создать»
Введите название переменной – msg_send, в качестве формата выберите Строка.
Аналогично создаётся переменная msg_rec в процессе SimpleMessageReceive
Создание графических форм
Создание графических форм при помощи конструктора форм
Кликните на узел «Ввод данных» графа процесса SimpleMessageSend правой кнопкой мыши и выберите команду «Форма» > «Создать форму» (левой кнопкой мыши):
В появившимся выпадающем списке выберите тип формы «HTML форма + freemarker теги» Появится форма, на которую необходимо поместить тег InputVariable для ввода значения в переменную msg_send:
В процессе SimpleMessageReceive создаём форму в узле “Вывод данных”, процесс создания аналогичен вышеописанному примеру. На форме необходимо расположить FTL тег “DisplayVariable” для вывода значения переменной msg_rec:
Задание проверок значений, введенных в элементы форм (валидация)
В процессе SimpleMessageSend необходимо задать проверку переменной msg_send, выбрав валидатор “Обязательное поле”. Для этого кликните правой клавишей мыши на узле ввод данных, и в появившейся форме выберите «Переменные формы (валидация)»:
В появившейся форме будет отображена переменная msg_send. Для выбранного поля в окне «Валидаторы» необходимо установить валидатор “Обязательное поле”, и ввести текст сообщения об ошибке:
Настройка межпроцессного взаимодействия
Настройка отправителя
В процессе SimpleMessageSend необходимо настроить отправку сообщения, для этого кликните правой клавишей мыши на узле “Отправить данные” и выберите пункт “отправить сообщение”:
На появившейся форме необходимо добавить свойства маршрутизации, а также данные пересылаемые в сообщении:
Используем отправку “По названию процесса”, для этого необходимо кликнуть на соответствующую кнопку и ввести название процесса, в данном случае SimpleMessageReceive
Далее необходимо задать переменные, которые будут отправлены в сообщении. Для этого кликните на кнопку “добавить”, расположенную внизу формы, и выберите переменную msg_send. Также здесь есть возможность задать имя, под которым данная переменная будет в сообщении:
Получаем следующие настройки:
Настройка получателя
В процессе SimpleMessageReceive необходимо настроить параметры получения сообщения, для этого кликните правой клавишей мыши на узле “Получить данные” и выберите пункт “получить сообщение”:
На появившейся форме необходимо добавить свойства маршрутизации, а также соответствие переменных для получения данных. Используем получение по “По названию процесса”, для этого необходимо кликнуть на соответствующую кнопку, в результате в свойствах появится: processDefinitionName = ${currentDefinitionName}
где currentDefinitionName указывает на текущее название процесса
Также необходимо добавить переменные принимаемые в сообщении, для этого нажмите кнопку “добавить” внизу формы и выберите название переменной msg_rec
Затем в поле названия переменной в сообщении необходимо вписать msg_send
Таким образом, мы установили соответствие между посылаемой в сообщении переменной msg_send процесса SimpleMessageSend и переменной msg_rec в процессе simpleMessageReceive. Получаем следующие настройки:
Создание файла-архива бизнес-процесса и загрузка его в систему
Последовательность действий полностью повторяет последовательность, описанную для других бизнес-процессов, например «HelloWorldProcess». Также после загрузки необходимо настроить обладателей полномочий на данные процессы: Для SimpleMessageSend нужно добавить в обладатели полномочий группу manager
А для SimpleMessageReceive группу staff:
Выполнение процессов
Краткое описание процесса взаимодействия
Процессы SimpleMessageSend и SimpleMessageReceive показывают простой пример механизма межпроцессного взаимодействия реализованный при помощи сообщений.
Пользователь запускает экземпляр процесса SimpleMessageSend, вводит текст отправляемого сообщения, после чего происходит отправка в экземпляры процесса SimpleMessageReceive. Процесс SimpleMessageSend переходит в состояние “завершения”.
Пользователь, принадлежащий группе staff, запускает экземпляр процесса SimpleMessageReceive, после чего управление останавливается на узле “Получить данные”, ожидая данные.
Сообщение приходит во все экземпляры SimpleMessageReceive, где полученное значение переменной (текст сообщения) отображается на форме, после чего экземпляры SimpleMessageReceive также завершаются.
Рассмотрим два примера выполнения разработанного взаимодействия
Один получатель
Для запуска процесса SimpleMessageReceive необходимо войти под пользователем из группы staff, и кликнуть на название данного процесса в общем списке процессов:
Запустится экземпляр процесса, и управление остановится на узле “Получить данные” ожидая сообщение
Далее пользователь входящий в группу manager (например julius) запускает экземпляр процесса SimpleMessageSend, вводит текст посылаемого сообщения:
Экземпляр процесса SimpleMessageSend завершается.
При этом экземпляр процесса SimpleMessageReceive, получает сообщение и управление переходит в узел “Вывод данных”,
пользователь attila видит присланное сообщение на форме:
Ниже приведена история выполнения описанных процессов:
Несколько получателей
Второй рассматриваемый пример взаимодействия – это отправка сообщения сразу нескольким экземплярам SimpleMessageReceive
Запустим экземпляры процесса SimpleMessageReceive под всеми пользователями входящими в группу staff:
- Attila
- Gaiua
- Marcus
Далее запускаем экземпляр процесса SimpleMessageSend под пользователем входящим в группу manager, как и в первом примере вводим сообщение “Hello World!!!”
После чего сообщение придёт сразу во все ожидающие его экземпляры SimpleMessageReceive
История выполнения:
Пример сложного процесса взаимодействия с помощью сообщений
Сценарий процессов
В данном разделе рассматриваются процессы, показывающие механизм межпроцессного взаимодействия в системе Runa WFE, реализованный при помощи сообщений.
MessageQuery отправляет сообщение в процесс MessageResponse, используется маршрутизация “по названию процесса”. В качестве данных пересылаемых в сообщении используется введённая пользователем строка, а также id экземпляра процесса MessageQuery
MessageResponse получает данные, пользователь изменяет полученное значение строки, и высылает сообщение обратно в процесс MessageQuery, при этом используется маршрутизация “по ID процесса”
Разработка графа
Создайте новый проект, затем кликните левой кнопкой мыши на команду «Новый процесс». Введите в появившемся диалоге “ MessageQuery ” в качестве имени процесса. Данный процесс разработаем на языке BPMN.
Аналогично создайте процесс MessageResponse.
Сделайте двойной клик на появившейся строке «MessageQuery». Появится окно диаграммы бизнес-процесса. Выбирая элементы палитры, нарисуйте следующий граф бизнес-процесса:
Здесь используется следующие элементы: “Начало”, “Окончание”, “Узел действие”, “Отправить сообщение”/“Получить сообщение”, а также “Задача сценария”
Для задания подписи элемента отличной от подписи по-умолчанию, выделите элемент кликнув на него, и еще раз кликните на элементе. Аналогично нарисуйте граф для процесса MessageResponse следующего вида:
Т.е. как видно из графов, в обоих процессах используется элементы отправки и принятия сообщений, в отличии от процессов 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, в качестве формата выберите Строка.
Аналогично создаётся переменная str_response в процессе MessageResponse Также необходимо создать переменные id_query в соответствующих процессах:
Создание обработчиков
В процессе MessageQuery необходимо создать обработчик ExecuteFormulaActionHandler, в котором определить id данного экземпляра и проинициализировать полученным значением переменную id_query Для этого выделите узел задачу сценария,
Затем выберите класс обработчика – ExecuteFormulaActionHandler, и задайте конфигурацию обработчика:
где get_instance_id() – это функция возвращающая id экземпляра процесса
Создание графических форм
Создание графических форм при помощи конструктора форм
Кликните на узел «Ввод данных» графа процесса MessageQuery правой кнопкой мыши и выберите команду «Форма» > «Создать форму» (левой кнопкой мыши):
В появившимся выпадающем списке выберите тип формы «HTML форма + freemarker теги» Появится форма, на которую необходимо поместить тег InputVariable для ввода значения в переменную str_query:
В процессе MessageResponse также создаём форму в узле “Ввод данных”, процесс создания аналогичен вышеописанному примеру. На форме необходимо расположить тег InputVariable для редактирования значения переменной str_response.
Также необходимо создать форму для отображения значения переменной после взаимодействия между процессами.
Кликните на узел «Вывод данных» графа процесса MessageQuery правой кнопкой мыши и выберите команду «Форма» > «Создать форму» (левой кнопкой мыши), после чего расположите на форме FTL тег “DisplayVariable” для str_query.
Настройка межпроцессного взаимодействия
Настройка отправителя в процессе MessageQuery
Для настройки отправки кликните правой клавишей мыши на элементе “отправить сообщение”, и выберите одноименный пункт меню:
В свойствах маршрутизации укажите следующие настройки:
Т.е. отправляем переменные id_query и str_query в процесс MessageResponse (отправка по названию процесса)
Настройка получателя в процессе MessageResponse
Для настройки кликните правой клавишей мыши на элементе “получить сообщение”, и выберите одноименный пункт меню:
В свойствах маршрутизации укажите следующие настройки:
т.е. принимаем значение переменной id_query из сообщения в переменную id_query экземпляра процесса MessageResponse, а значение str_query в переменную str_response
Настройка отправителя в процессе MessageResponse
После получения и обработки сообщения, процесс MessageResponse возвращает обработанные данные в экземпляр процесса MessageQuery, для этого используются следующие настройки:
Добавляем свойство маршрутизации:
что подразумевает выбор получателя по id экземпляра процесса, значение id хранится в переменной id_query
Добавляем переменные:
Получаем:
Настройка получателя в процессе MessageQuery
Обработанные в MessageResponse данные возвращаются в MessageQuery, для принятия этих данных необходимо настроить элемент “Принять сообщение” следующим образом:
Свойство маршрутизации задаём как 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, и кликнуть на название данного процесса в общем списке процессов:
Стартует новый экземпляр процесса, управление переходит в узел “Ввод данных”
Вводим текст сообщения для отправки, например: “Hello”
Далее происходит определение id данного экземпляра процесса и отправка сообщения, содержащего переменные str_query и id_query.
Управление переходит в “Принять сообщение”, здесь оно будет находиться до тех пор, пока не получит сообщение от процесса MessageResponse
Запускаем экземпляр процесса MessageResponse, для этого входим в систему под пользователем входящим в группу staff
После запуска, управление останавливается на узле ожидания сообщения
После получения сообщения, управление переходит в узел ввода данных:
Здесь пользователь дополняет полученное сообщение:
Далее происходит отправка сообщения (Hello World!!!), в экземпляр процесса выбранного по id, после чего процесс MessageResponse завершается:
Процесс MessageQuery получает сообщение, содержащее переменную str_response, переменная str_query инициализируется значением Hello World!!!, и выводится на форму узла “Вывод данных”
Процесс завершается: