getWorkflowId(); $olderThanDate = $this->clock->now()->sub(new \DateInterval(self::KEEP_INTERVAL)); $staleWorkflows = $this->workflowRepository->findWorkflowsWithoutFinalStepAndOlderThan($olderThanDate); $workflow = $this->workflowRepository->find($workflowId); if (in_array($workflow, $staleWorkflows, true)) { $this->logger->alert('Workflow has transitioned in the meantime.', [$workflowId]); return; } if (null === $workflow) { $this->logger->alert('Workflow was not found!', [$workflowId]); return; } $workflowComponent = $this->registry->get($workflow, $workflow->getWorkflowName()); $metadataStore = $workflowComponent->getMetadataStore(); $transitions = $workflowComponent->getEnabledTransitions($workflow); $steps = $workflow->getSteps(); $transitionApplied = false; if (1 === count($steps)) { $this->em->remove($workflow->getCurrentStep()); $this->em->remove($workflow); } else { foreach ($transitions as $transition) { $isFinal = $metadataStore->getMetadata('isFinal', $transition); $isFinalPositive = $metadataStore->getMetadata('isFinalPositive', $transition); if ($isFinal && !$isFinalPositive) { $workflowComponent->apply($workflow, $transition->getName()); $this->logger->info('EntityWorkflow has been cancelled automatically.', [$workflowId]); $transitionApplied = true; break; } } if (!$transitionApplied) { $this->logger->error('No valid transition found for EntityWorkflow %d.', [$workflowId]); throw new UnrecoverableMessageHandlingException(sprintf('No valid transition found for EntityWorkflow %d.', $workflowId)); } } } }