/** * @inheritdoc */ protected function execute(InputInterface $input, OutputInterface $output) { $action = $input->getArgument('action'); $payload = $input->getArgument('payload'); $priority = $input->getOption('priority'); $delay = $input->getOption('delay'); $ttr = $input->getOption('ttr'); $dql = $input->getOption('dql'); if ($payload && $dql) { throw new \InvalidArgumentException('You cannot provide both a <comment>payload</comment> and a <comment>--dql</comment> query.'); } if (!empty($payload)) { $job = $this->manager->add($action, $payload, $delay, $priority, $ttr); $output->writeln(sprintf('Scheduled job <info>%d</info> with payload <info>%s</info>', $job, json_encode($payload))); return 0; } if (empty($dql)) { throw new \InvalidArgumentException('You must provide either a <comment>payload</comment> or a <comment>--dql</comment> query.'); } if (!$this->doctrine) { $output->writeln('<error>Doctrine is required for the --dql option</error>'); return 1; } $doctrine = $this->doctrine->getManager(); if (!$doctrine instanceof EntityManagerInterface) { $output->writeln('<error>Sorry, only Doctrine\'s ORM is supported at this point. You\'re welcome to submit a PR of course!</error>'); return 1; } $meta = null; $query = $doctrine->createQuery($dql); foreach ($query->iterate() as list($entity)) { if (!$meta) { $meta = $doctrine->getClassMetadata(get_class($entity)); } $job = $this->manager->addForObject($action, $entity, $delay, $priority, $ttr); $output->writeln(sprintf('Scheduled job <info>%d</info> for entity <info>%s: %s</info>', $job, json_encode($meta->getIdentifierValues($entity)), $this->entityToString($entity))); $doctrine->clear(); } return 0; }
/** * @expectedException \InvalidArgumentException * @expectedExceptionMessage Action "test" is not defined in QueueManager */ public function testAddForMissingAction() { $this->manager->add('test', []); }
/** * @param RateLimitEvent $event */ public function onRateLimit(RateLimitEvent $event) { $payload = [$event->getScraper()->getId(), $event->getUrl()]; $this->queueManager->add(ScrapeUrlExecutor::NAME, $payload, $event->getRetryDate()->getTimestamp() - time()); }
/** * @param ScrapeUrlEvent $event */ public function onScrapeNextUrl(ScrapeUrlEvent $event) { $this->queueManager->add(ScrapeUrlExecutor::NAME, [$event->getScraper()->getId(), $event->getUrl()]); }