/** * Run the job. * * @param Job $job The job to be executed. * @return void * @throws \yii\base\Exception Exception. */ public function run(Job $job) { $this->trigger(self::EVENT_BEFORE_RUN, $beforeEvent = new Event(['job' => $job])); if (!$beforeEvent->isValid) { return; } \Yii::info('Running job', 'yii2queue'); try { if ($job->isCallable()) { $retval = $job->runCallable(); } else { $retval = $this->module->runAction($job->route, $job->data); } } catch (\Exception $e) { if ($job->isCallable()) { if (isset($job->header['signature']) && isset($job->header['signature']['route'])) { $id = $job->id . ' ' . \yii\helpers\Json::encode($job->header['signature']['route']); } else { $id = $job->id . ' callable'; } } else { $id = $job->route; } \Yii::error("Fatal Error: Error running route '{$id}'. Message: {$e->getMessage()}", 'yii2queue'); if ($this->releaseOnFailure) { $this->release($job); } throw new \yii\base\Exception("Error running route '{$id}'. " . "Message: {$e->getMessage()}. " . "File: {$e->getFile()}[{$e->getLine()}]. Stack Trace: {$e->getTraceAsString()}", 500); } $this->trigger(self::EVENT_AFTER_RUN, new Event(['job' => $job, 'returnValue' => $retval])); if ($retval !== false) { \Yii::info('Deleting job', 'yii2queue'); $this->delete($job); } else { if ($this->releaseOnFailure) { $this->release($job); } } }