Activiti. Обработка условия по таймеру

Добрый день.

Имеется подпроцесс c исполняемым на нем timer boundary event. Необходимо по данному таймеру проверять определенное условие. Если условие выполнено, происходит выход из подпроцесса, если нет - процесс продолжается. Проблема в том, что не могу понять, как осуществить return в уже рабочий подпроцеcc, если условие вернуло false.

Прощу подсказки в реализации.

Добрый день,

как возможный вариант, рассмотрите использование non-interrupting timer boundary event, он позволяет при достижении таймера выполнить отдельную ветвь процесса, не прерывая при этом активность, к которой приаттачен. В этой ветви вы можете проверить необходимые условия и принять решение, завершить ли подпроцесс.

В моём примере, при срабатывании таймера триггерится userTask для принятия такого решения пользователем, при выборе ауткама “Interrupt subProcess” выполнение передаётся в сервисную таску с типом javaDelegate, в который можно передать идентификатор подпроцесса, который нужно завершить, код самого делегата

@Component("interruptSubProcessJavaDelegate")
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public class InterruptSubProcessJavaDelegate implements JavaDelegate {

    Expression subProcessId;

    @Override
    public void execute(DelegateExecution execution) {

        Execution executionToInterrupt = null;
        if (subProcessId != null) {
            String supProcessToInterrupt = (String) subProcessId.getValue(execution);
            List<Execution> taskList = ProcessEngines.getDefaultProcessEngine().getRuntimeService()
                    .createExecutionQuery()
                    .activityId(supProcessToInterrupt)
                    .list();
            if (CollectionUtils.isNotEmpty(taskList)) {
                executionToInterrupt = taskList.get(0);
            }
        }

        if (executionToInterrupt != null) {
            CommandContext commandContext = Context.getCommandContext();
            ExecutionEntityManager executionEntityManager = CommandContextUtil.getExecutionEntityManager(commandContext);

            executionEntityManager.deleteChildExecutions(((ExecutionEntity) executionToInterrupt), null, false);
            executionEntityManager.deleteExecutionAndRelatedData(((ExecutionEntity) executionToInterrupt), null, false);
        }

    }
}

В случае, если выбран другой ауткам, данная ветвь процесса завершается и выполнение подпроцесса продолжается.
Диаграмма процесса
image

process.bpmn20.xml (9.5 КБ)

1 симпатия

Спасибо, буду пробовать.