/** * @param array $criteria * @return Job[] */ public function findDelayed(array $criteria) : array { if (sizeof($criteria) === 0) { return []; } $search = []; $where = $this->buildPlainArray($criteria); foreach (Delayed::findByPlainData($where)->all() as $payload) { /** @var Delayed $payload */ $search[] = new Job($this, $payload->getPayloadAttributes(), $payload->queue); } return $search; }
/** * @param array $payload * @return Delayed * @throws Exception */ public static function push(array $payload) { $attributes = $payload; unset($attributes['id']); $delayed = new Delayed($attributes); if (!$delayed->save()) { throw new Exception('Cannot push delayed job', $delayed->getErrors()); } return $delayed; }
/** * @return int Count of pushed jobs */ protected function processDelayed() { /** @var BaseQueue $queue */ $queue = self::$queue; $sent = 0; foreach ($queue->getDelayedList() as $delayedJob) { /** @var Job $delayedJob */ if ($this->debug) { echo "Job time: " . $delayedJob->getPayload()->getDelayTime() . ': now time ' . time() . "\n"; } if ((int) $delayedJob->getPayload()->getDelayTime() <= time()) { echo "Delayed job is out of time at " . (time() - (int) $delayedJob->getPayload()->getDelayTime()) . " seconds\n"; $job = Delayed::pop($delayedJob->getPayload()->getId()); if ($job !== null) { $queue->pushJob($delayedJob->getPayload()); $sent++; } else { $this->stderr("But RPOP returned NULL ({$queue->delayedQueuePrefix})", Console::FG_RED); } } if ($this->poolGapSeconds > 0) { usleep($this->poolGapSeconds * 1000000); } } return $sent; }