예제 #1
0
 /**
  * Runs the import
  */
 public function run(Feed $feed)
 {
     $this->startTime = microtime(true);
     while ($item = $this->getNextItem($feed)) {
         // increase item count
         $this->processed++;
         // dispatch event for next item
         $event = new ItemEvent($this, $item);
         $this->eventDispatcher->dispatch(ImportEvents::ITEM_START, $event);
         // import the item
         try {
             $source = $this->handler->handle($this->import->getFeed(), $item);
             $this->successItem($item, $source);
         } catch (FailedItemException $e) {
             $this->failItem($item, $e->getMessage());
         }
         // item done
         $this->eventDispatcher->dispatch(ImportEvents::ITEM_FINISH, $event);
         // clear entitymanager after batch
         if ($this->processed % $this->batchSize === 0) {
             $this->flush();
             $this->clear();
         }
     }
     // flush remaining changes
     $this->flush();
     $this->clear();
     $this->logger->finishImportLog($this->import);
     $this->logger->logImportResult($this);
 }
예제 #2
0
 /**
  * @param Import $import
  *
  * @throws \RuntimeException
  *
  * @return boolean
  */
 public function finishImport(Import $import)
 {
     if (!$this->isImportStarted($import)) {
         throw new \RuntimeException('Import has not yet started');
     }
     if ($this->importHasUnfinishedParts($import)) {
         throw new \RuntimeException('Cannot close import until all parts have finished');
     }
     $this->logger->getLogger()->debug(sprintf('Finishing import %d as all %d parts have been finished', $import->getId(), $import->getParts()->count()));
     // set number of errored parts
     $erroredParts = $import->getParts()->filter(function (ImportPart $part) {
         return $part->getError();
     })->count();
     $import->setNumberOfErroredParts($erroredParts);
     // set end-date/time
     $import->setDatetimeEnded(new \DateTime());
     // flush the end result, and finish the log
     $this->getEntityManager()->flush($import);
     $this->logger->finishImportLog($import);
     // if there are parts with errors, remove the import resources
     if ($this->importHasErrors($import)) {
         $this->logger->getLogger()->debug('Removing feed resources as the import contained errors');
         try {
             $reader = $this->createImportReader($import, new EventDispatcher(), $this->getReaderOptions($import));
             $this->removeResources($reader->getResources());
         } catch (ReadException $e) {
             // ignore read errors
         }
     }
     $this->eventDispatcher->dispatch(ImportEvents::IMPORT_FINISH, new ImportEvent($import));
 }