6.1. Пример Task Execution
Пример показывает:
-
Как программно задать участников процесса на старте, используя
ProcActionsFrame
-
Как передать процессные переменные на старте процесса, используя
ProcActionsFrame
-
Как получить и изменить стандартные процессные действия, автоматически сгенерированные фреймом
ProcActionsFrame
(например, изменить заголовок кнопки "Запустить процесс") -
Как программно запустить процесс без использования
ProcActionsFrame
-
Как с помощью
ActivitiEventListener
автоматически обновлять поле сущности (в данном примереprocessState
) при движении по процессу
Пример использует модель Task execution - 1:

Посмотреть как работает данный пример в приложении можно в экране Application - Tasks.
В текущем примере не используется StandardProcForm
. Для назначения участников процесса мы воспользуемся before start process predicate фрейма ProcActionsFrame
. См. метод setBeforeStartProcessPredicate()
в коде TaskEdit.java на GitHub.
Метод setStartProcessActionProcessVariablesSupplier()
в TaskEdit.java демонстрирует как передать процессные переменные на старте процесса с помощью ProcActionsFrame
. Процессная переменная acceptanceRequired
будет использоваться одним из gateway в процессе для принятия решения, должен ли процесс выполнения задачи завершиться, либо же задача должна уйти инициатору для утверждения.
Метод changeStartProcessBtnCaption()
показывает как можно получить действие запуска процесса, которое было автоматически создано фреймом ProcActionsFrame
, и поменять заголовок кнопки "Start process" на любой произвольный.
Метод startProcessProgrammatically()
демонстрирует как программно запустить процесс без использования фрейма ProcActionsFrame
.
public void startProcessProgrammatically() {
if (commit()) {
//The ProcInstanceDetails object is used for describing a ProcInstance to be created with its proc actors
BpmEntitiesService.ProcInstanceDetails procInstanceDetails = new BpmEntitiesService.ProcInstanceDetails(PROCESS_CODE)
.addProcActor("initiator", getItem().getInitiator())
.addProcActor("executor", getItem().getExecutor())
.setEntity(getItem());
//The created ProcInstance will have two proc actors. None of the entities is persisted yet.
ProcInstance procInstance = bpmEntitiesService.createProcInstance(procInstanceDetails);
//A map with process variables that must be passed to the Activiti process instance when it is started.
//This variable is used in the model to make a decision for one of gateways.
HashMap<String, Object> processVariables = new HashMap<>();
processVariables.put("acceptanceRequired", getItem().getAcceptanceRequired());
//Starts the process. The "startProcess" method automatically persists the passed procInstance with its actors
processRuntimeService.startProcess(procInstance, "Process started programmatically", processVariables);
showNotification(getMessage("processStarted"));
//refresh the procActionsFrame to display complete tasks buttons (if a process task appears for the current
//user after the process is started)
initProcActionsFrame();
}
}
UpdateProcessStateListener.java - это реализация интерфейса org.activiti.engine.delegate.event.ActivitiEventListener
. Данный слушатель зарегистрирован на уровне процесса. Он выполняет следующее: каждый раз, когда процесс входит в новое состояние, в поле processState
связанной с процессом сущности com.company.bpmsamples.entity.Task
проставляется имя текущего шага процесса.
Конфигурация данного слушателя в модели процесса:

Для открытия данного экрана необходимо щёлкнуть в пусто место в моделере, затем Show advanced properties, и далее Event listeners.
Больше информации содержится комментариях к исходному коду на GitHub.
XML дескриптор редактора сущности Task
: task-edit.xml
Java контроллер редактора сущности Task
: TaskEdit.java
Слушатель Activiti, обновляющий поле processState
: UpdateProcessStateListener.java