protected function execute(InputInterface $input, OutputInterface $output) { $id = $input->getArgument('id'); $force = $input->getOption('force'); $manager = $this->importManager; $doctrine = $manager->getEntityManager(); /** @var $feed Feed */ if (null === ($feed = $doctrine->find('FMIoBundle:Feed', $id))) { $output->writeln(sprintf('<error>Feed with id "%d" does not exist</error>', $id)); return 1; } if ($input->isInteractive()) { $this->checkForUnfinishedImports($feed, $output); } $manager->getLogger()->getLogger()->pushHandler(new ConsoleHandler($output)); $this->setOutputEvents($manager->getEventDispatcher(), $output); // schedule all resources $dispatcher = $manager->getEventDispatcher(); $import = $manager->createImport($feed, null, $force); $reader = $manager->createImportReader($import, $dispatcher, $manager->getReaderOptions($import)); $output->writeln(sprintf('Created import with id <info>%d</info>, start importing parts', $import->getId())); try { while ($reader->getResources()->count()) { $resource = $reader->getResources()->dequeue(); $transportConfig = TransportFactory::createConfigFromTransport($resource->getTransport()); $manager->createImportPart($import, $transportConfig); $output->writeln(sprintf('=> <comment>%s</comment> (<comment>%d</comment> resources left)', (string) $resource->getTransport(), $reader->getResources()->count())); } } catch (FeedException $e) { $output->writeln(sprintf('<error>%s</error>', $e->getMessage())); } foreach ($import->getParts() as $part) { $output->writeln(sprintf('Importing part <comment>%d</comment>', $part->getPosition())); $manager->import($part); } return 0; }
/** * @param OutputInterface $output * @param array $feeds * @param integer $minutes * @param boolean $force * * @return integer */ protected function scheduleImports(OutputInterface $output, array $feeds, $minutes, $force = false) { if (empty($feeds)) { return 0; } $repo = $this->getFeedRepository(); $manager = $this->importManager; $num = 0; $factor = $minutes / sizeof($feeds); foreach ($feeds as $id => $priority) { /** @var Feed $feed */ $feed = $repo->find($id); $offset = round($factor * $num++); $date = new \DateTime(sprintf('+%d minutes', $offset)); $output->writeln(sprintf('Scheduling import for <info>%s</info> feed <info>%d</info> to run at <info>%s</info>', $feed->getOrigin()->getName(), $feed->getId(), $date->format('Y-m-d H:i:s'))); // schedule all resources try { $dispatcher = $manager->getEventDispatcher(); $import = $manager->createImport($feed, $date, $force); $reader = $manager->createImportReader($import, $dispatcher, $manager->getReaderOptions($import)); } catch (\RuntimeException $e) { // we could get an exception when a new import cannot be created, for example when an existing import // for this feed is still running. $output->writeln(sprintf('<error>%s</error>', $e->getMessage())); continue; } $output->writeln(sprintf('Created import <info>%d</info>, adding parts...', $import->getId())); try { while ($reader->getResources()->count()) { $resource = $reader->getResources()->dequeue(); $transportConfig = TransportFactory::createConfigFromTransport($resource->getTransport()); $manager->createImportPart($import, $transportConfig, $date); $output->writeln(sprintf('=> <comment>%s</comment> (<comment>%d</comment> resources left)', (string) $resource->getTransport(), $reader->getResources()->count())); } } catch (FeedException $e) { $output->writeln(sprintf('<error>%s</error>', $e->getMessage())); } if ($import->getParts()->count() === 0) { $output->writeln('No parts created, finishing import now'); $manager->startImport($import); $manager->finishImport($import); continue; } $output->write('Scheduling jobs for all parts...'); foreach ($import->getParts() as $part) { $delay = $date->getTimestamp() - time(); if ($delay < 0) { $delay = 0; } $this->queueManager->addForObject(ImportPartExecutor::NAME, $part, $delay); } $output->writeln(' <info>done!</info>'); } return 0; }