/** * @param TaskListPosition $parentTaskListPosition * @param array $processDefinition * @param bool $syncLogMessages * @param string $target * @param WorkflowMessage $previousMessage * @throws \InvalidArgumentException * @return StartSubProcess */ public static function at(TaskListPosition $parentTaskListPosition, array $processDefinition, $syncLogMessages, $target, WorkflowMessage $previousMessage = null) { if (!is_bool($syncLogMessages)) { throw new \InvalidArgumentException("Argument syncLogMessages must be of type boolean"); } if (!is_string($target)) { throw new \InvalidArgumentException("Target must be string"); } if (empty($target)) { throw new \InvalidArgumentException('Target must be a non empty string'); } $previousMessageArrayOrNull = is_null($previousMessage) ? null : $previousMessage->toServiceBusMessage()->toArray(); $payload = ['parent_task_list_position' => $parentTaskListPosition->toString(), 'sync_log_messages' => $syncLogMessages, 'sub_process_definition' => $processDefinition, 'previous_message' => $previousMessageArrayOrNull, 'origin' => $parentTaskListPosition->taskListId()->nodeName()->toString(), 'target' => $target]; return new self(self::MSG_NAME, $payload); }
/** * @param TaskListPosition $position * @return bool */ public function equals(TaskListPosition $position) { return $this->taskListId()->equals($position->taskListId()) && $this->position() === $position->position(); }
/** * @param TaskListPosition $taskListPosition * @param WorkflowMessage|LogMessage $lastAnswer * @throws \RuntimeException If process cannot be found * @throws \Exception If error occurs during processing */ private function continueProcessAt(TaskListPosition $taskListPosition, $lastAnswer) { $process = $this->processRepository->get($taskListPosition->taskListId()->processId()); if (is_null($process)) { throw new \RuntimeException(sprintf("Last received message %s (%s) contains unknown processId. A process with id %s cannot be found!", $lastAnswer->getMessageName(), $lastAnswer->uuid()->toString(), $taskListPosition->taskListId()->processId()->toString())); } $this->beginTransaction(); try { $process->receiveMessage($lastAnswer, $this->workflowEngine); $this->commitTransaction(); } catch (\Exception $ex) { $this->rollbackTransaction(); throw $ex; } if ($process->isFinished()) { $this->processorEventQueue->enqueue($this->events()->getNewActionEvent('process_did_finish', $this, ['process_id' => $process->processId()->toString(), 'finished_at' => $lastAnswer->createdAt()->format(\DateTime::ISO8601), 'succeed' => $process->isSuccessfulDone()])); } if ($process->isSubProcess() && $process->isFinished()) { if ($process->isSuccessfulDone()) { $this->informParentProcessAboutSubProcess($process, true, $lastAnswer); } else { if (!$lastAnswer instanceof LogMessage) { $lastAnswer = LogMessage::logException(new \RuntimeException("Sub process failed but last message was not a LogMessage"), $process->parentTaskListPosition()); } if (!$lastAnswer->isError()) { $lastAnswer = LogMessage::logErrorMsg($lastAnswer->technicalMsg(), $lastAnswer); } $this->informParentProcessAboutSubProcess($process, false, $lastAnswer); } } }
/** * @param TaskListPosition $taskListPosition */ private function setTaskListPosition(TaskListPosition $taskListPosition) { $this->taskListPosition = $taskListPosition; $this->setProcessId($taskListPosition->taskListId()->processId()); }
/** * @param Task $task * @param TaskListPosition $taskListPosition * @param WorkflowMessage $workflowMessage * @return LogMessage */ public static function logWrongMessageReceivedFor(Task $task, TaskListPosition $taskListPosition, WorkflowMessage $workflowMessage) { return new self($taskListPosition->taskListId()->nodeName()->toString(), $taskListPosition, sprintf("Process %s received wrong message with name %s for task %s at position %d", $taskListPosition->taskListId()->processId()->toString(), $workflowMessage->messageName(), get_class($task), $taskListPosition->position()), self::ERROR_WRONG_MESSAGE_RECEIVED, array('process_id' => $taskListPosition->taskListId()->processId()->toString(), 'task_list_position' => $taskListPosition->position(), 'task_class' => get_class($task), 'task_as_json' => json_encode($task->getArrayCopy()), 'message_name' => $workflowMessage->messageName())); }
public static function at(TaskListPosition $taskListPosition, array $payload = array()) { $payload['taskListPosition'] = $taskListPosition->toString(); return parent::occur($taskListPosition->taskListId()->processId()->toString(), $payload); }