/** * {@inheritdoc} */ public function pop(string $queue = null) { $queue = $this->getQueue($queue); $job = $this->pheanstalk->watchOnly($queue)->reserve(0); if ($job instanceof PheanstalkJob) { return new BeanstalkdJob($this->container, $this->pheanstalk, $job, $queue); } }
/** * @return int Status code to exit with */ public function run() { $env = $this->context->env; $tube = $env->get('BEANSTALKD_TUBE') ?: 'default'; $class = $env->get('BEANSTALKD_CONSUMER'); if (!$class) { $this->stdio->outln('<<red>>BEANSTALKD_CONSUMER environmental variable is not set<<reset>>'); return Status::USAGE; } if (!class_exists($class)) { $this->stdio->outln(sprintf('<<red>>BEANSTALKD_CONSUMER does not reference a locatable class: %s<<reset>>', $class)); return Status::DATAERR; } if (!in_array(ConsumerInterface::class, class_implements($class))) { $this->stdio->outln(sprintf('<<red>>BEANSTALKD_CONSUMER references a class that does not implement ConsumerInterface: %s<<reset>>', $class)); return Status::DATAERR; } $this->pheanstalk->watchOnly($tube); $consumer = call_user_func($this->resolver, $class); while (call_user_func($this->listener)) { $reserved = $this->pheanstalk->reserve(); if (!$reserved) { continue; } $job = new Job($reserved->getId(), $reserved->getData()); try { $result = $consumer->consume($job); if ($result === false) { $this->pheanstalk->release($job); continue; } } catch (\Exception $e) { $this->pheanstalk->release($job); throw $e; } $this->pheanstalk->delete($job); } return Status::SUCCESS; }