6.1. Пример Task Execution

Пример показывает:

  • Как программно задать участников процесса на старте, используя ProcActionsFrame

  • Как передать процессные переменные на старте процесса, используя ProcActionsFrame

  • Как получить и изменить стандартные процессные действия, автоматически сгенерированные фреймом ProcActionsFrame (например, изменить заголовок кнопки "Запустить процесс")

  • Как программно запустить процесс без использования ProcActionsFrame

  • Как с помощью ActivitiEventListener автоматически обновлять поле сущности (в данном примере processState) при движении по процессу

Пример использует модель Task execution - 1:

TaskExecution1Model

Посмотреть как работает данный пример в приложении можно в экране 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 проставляется имя текущего шага процесса.

Конфигурация данного слушателя в модели процесса:

TaskExecution1UpdateProcessStateListener

Для открытия данного экрана необходимо щёлкнуть в пусто место в моделере, затем Show advanced properties, и далее Event listeners.

Больше информации содержится комментариях к исходному коду на GitHub.

XML дескриптор редактора сущности Task: task-edit.xml

Java контроллер редактора сущности Task: TaskEdit.java

Слушатель Activiti, обновляющий поле processState: UpdateProcessStateListener.java