Добрый день,
как возможный вариант, рассмотрите использование 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);
}
}
}
В случае, если выбран другой ауткам, данная ветвь процесса завершается и выполнение подпроцесса продолжается.
Диаграмма процесса
process.bpmn20.xml (9.5 КБ)