QueueServiceProvider
Die meisten Registrierungen der verschiedenen Dienste von Laravel sind über verschiedene ServiceProvider gebunden, und Warteschlangendienste sind keine Ausnahme. Öffnen Sie die Namespace-Datei IlluminateQueueQueueServiceProvider und suchen Sie die Registermethode
public function register() { // 注册队列管理器 一旦实例化,为队列连接器注册各种解析器,这些连接器负责创建接受队列配置和实例化各种不同队列处理的类。 // 按照配置文件注册一个默认连接方式 在此使用 redis $this->registerManager(); // 注册队列各种命令 队列连接 重启等。 $this->registerWorker(); // 注册队列监听命令 $this->registerListener(); // 5.1后弃用 $this->registerSubscriber(); // 注册队列失败处理 $this->registerFailedJobServices(); // Register the Illuminate queued closure job. 什么用,后面再看。 $this->registerQueueClosure(); }
Aufgabenerstellung und -zuweisung
php artisan make:job SendReminderEmail
Eine Warteschlangenaufgabenklasse wird gemäß dem Dokument generiert. Diese Klasse erbt den Namensraum AppJobsJob und implementiert die Schnittstellen SelfHandling und ShouldQueue. Es gibt keine Vorgabe für die Verwendung (überspringen Sie es vorerst). Der Schwerpunkt liegt auf den beiden Merkmalen, die verschiedene Vorgänge für Warteschlangenaufgaben implementieren, wie z. B. Löschen, Wiederholen, Verzögern usw.
Bei der Aufgabenzuweisung verwenden wir die Hilfsfunktion „dispatch“, die eigentlich die Dispatcher-Methode der Dispatcher-Klasse unter IlluminateBus ist
public function dispatch($command, Closure $afterResolving = null) { if ($this->queueResolver && $this->commandShouldBeQueued($command)) { // 队列执行 return $this->dispatchToQueue($command); } else { // 立即执行 return $this->dispatchNow($command, $afterResolving); } } protected function commandShouldBeQueued($command) { if ($command instanceof ShouldQueue) { // 就这用。。 return true; } return (new ReflectionClass($this->getHandlerClass($command)))->implementsInterface( 'Illuminate\Contracts\Queue\ShouldQueue' ); }
Hier werfen wir zunächst einen Blick auf die
public function register() { $this->app->singleton('Illuminate\Bus\Dispatcher', function ($app) { return new Dispatcher($app, function () use ($app) { // 'queue.connection' => 'Illuminate\Contracts\Queue\Queue', 再回看 QueueServiceProvider 的 registerManager 方法,就很清晰了。 return $app['Illuminate\Contracts\Queue\Queue']; // 默认队列连接 }); }); }
Sehen Sie sich „dispatchToQueue“
public function dispatchToQueue($command) { $queue = call_user_func($this->queueResolver); // 在此为设置的默认值 将实例化 RedisQueue // 异常则抛出! if (! $queue instanceof Queue) { throw new RuntimeException('Queue resolver did not return a Queue implementation.'); } if (method_exists($command, 'queue')) { // 可以自定义 return $command->queue($queue, $command); } else { // 在此使用的是进入队列方式 最终结果类似 $queue->push(); 看 RedisQueue 下的 push 方法。 return $this->pushCommandToQueue($queue, $command); } }
unten an und Sie werden den gesamten Prozess der Eingabe der oben genannten Aufgabe in die Warteschlange verstehen. Was ist mit dem Entfernen von Aufgaben aus der Warteschlange? Wir können im Dokument sehen, dass wir die Warteschlange überwachen, indem wir die Anweisung php artisan queue:work ausführen. Werfen wir einen Blick auf den Namensraum IlluminateQueueConsoleWork(). Werfen wir einen Blick selbst.