/**
  * @param WorkflowMessage $message
  * @return LogMessage|WorkflowMessage
  */
 private function processData(WorkflowMessage $message)
 {
     $metadata = $message->metadata();
     $copiedTableName = null;
     $orgTableName = $this->table;
     if (isset($metadata[self::META_EMPTY_TABLE]) && $metadata[self::META_EMPTY_TABLE]) {
         $copiedTableName = $this->copyTable();
         //We override the target table to insert into the copy table first
         $this->table = $copiedTableName;
     }
     $forceInsert = true;
     if (is_null($copiedTableName) && isset($metadata[self::META_TRY_UPDATE]) && $metadata[self::META_TRY_UPDATE]) {
         $forceInsert = false;
     }
     $message = $this->updateOrInsertPayload($message, $forceInsert);
     $ignoreErrors = isset($metadata[self::META_IGNORE_ERRORS]) ? (bool) $metadata[self::META_IGNORE_ERRORS] : false;
     if (!is_null($copiedTableName)) {
         $this->table = $orgTableName;
         if (!$ignoreErrors && $message instanceof LogMessage) {
             $this->dropCopyTable($orgTableName);
             return $message;
         }
         $this->replaceOrgTableWithCopy($orgTableName, $copiedTableName);
     }
     return $message;
 }
 /**
  * @param WorkflowMessage $workflowMessage
  * @throws \InvalidArgumentException
  */
 private function processData(WorkflowMessage $workflowMessage)
 {
     $metadata = $workflowMessage->metadata();
     if (isset($metadata[self::META_LOCATION]) && !isset($metadata[self::META_PATH])) {
         $metadata[self::META_PATH] = $this->locationTranslator->getPathFor($metadata[self::META_LOCATION]);
     }
     if (!isset($metadata[self::META_FILENAME_TEMPLATE])) {
         throw new \InvalidArgumentException("Missing filename_pattern in metadata");
     }
     if (!isset($metadata[self::META_FILE_TYPE])) {
         throw new \InvalidArgumentException("Missing file_type in metadata");
     }
     if (!isset($metadata[self::META_PATH])) {
         throw new \InvalidArgumentException("Missing path in metadata");
     }
     $metadata[self::META_PATH] = $this->sanitizePath($metadata[self::META_PATH]);
     if (!is_dir($metadata[self::META_PATH])) {
         throw new \InvalidArgumentException(sprintf('Directory %s is invalid', $metadata[self::META_PATH]));
     }
     if (!is_writable($metadata[self::META_PATH])) {
         throw new \InvalidArgumentException(sprintf('Directory %s is not writable', $metadata[self::META_PATH]));
     }
     $type = $workflowMessage->payload()->toType();
     $fileTypeAdapter = $this->fileTypeAdapters->get($metadata[self::META_FILE_TYPE]);
     if ($type->description()->nativeType() === NativeType::COLLECTION && isset($metadata[self::META_WRITE_MULTI_FILES]) && $metadata[self::META_WRITE_MULTI_FILES]) {
         foreach ($type as $index => $item) {
             $this->writeTypeToFile($item, $metadata, $fileTypeAdapter, $index);
         }
     } else {
         $this->writeTypeToFile($type, $metadata, $fileTypeAdapter);
     }
     return $workflowMessage->answerWithDataProcessingCompleted($metadata);
 }
示例#3
0
 /**
  * @param WorkflowMessage $workflowMessage
  * @param WorkflowEngine $workflowEngine
  */
 private function startSubProcessForEachChunk(WorkflowMessage $workflowMessage, WorkflowEngine $workflowEngine)
 {
     $taskListEntry = $this->taskList->getNextNotStartedTaskListEntry();
     $this->recordThat(TaskEntryMarkedAsRunning::at($taskListEntry->taskListPosition()));
     $this->processingCollection = true;
     /** @var $task RunSubProcess */
     $task = $taskListEntry->task();
     $metadata = $workflowMessage->metadata();
     $currentOffset = 0;
     $currentLimit = (int) $metadata[self::META_LIMIT];
     $totalItems = (int) $metadata[self::META_TOTAL_ITEMS];
     //May start message was performed as a count only message so we unset this instruction to tell
     //the workflow message handler that it should collect the data now.
     unset($metadata[self::META_COUNT_ONLY]);
     do {
         $typeClass = $workflowMessage->payload()->getTypeClass();
         $metadata[self::META_OFFSET] = $currentOffset;
         $metadata[self::META_LIMIT] = $currentLimit;
         $collectChunk = WorkflowMessage::collectDataOf($typeClass::prototype(), $this->taskList->taskListId()->nodeName(), $task->targetNodeName(), $metadata);
         $collectChunk->connectToProcessTask($taskListEntry->taskListPosition());
         $this->recordThat(MultiPerformTaskWasStarted::at($taskListEntry->taskListPosition()));
         $this->performRunSubProcess($task, $taskListEntry->taskListPosition(), $workflowEngine, $collectChunk);
         $currentOffset = $currentOffset + $currentLimit;
     } while ($currentOffset + $currentLimit <= $totalItems);
     $this->processingCollection = false;
 }