摘要:按照配置文件注冊一個默認連接方式在此使用注冊隊列各種命令隊列連接重啟等。上面任務進入隊列的整個流程就明白了。
看完文檔 后總想知道是怎么樣一個開始,又是怎樣的一個結束!圖片來源
QueueServiceProviderLaravel 各種服務的注冊大多都是通過各種 ServiceProvider 進行綁定的,隊列服務也不例外,打開 namespace IlluminateQueueQueueServiceProvider 文件定位到 register 方法,
public function register() { // 注冊隊列管理器 一旦實例化,為隊列連接器注冊各種解析器,這些連接器負責創建接受隊列配置和實例化各種不同隊列處理的類。 // 按照配置文件注冊一個默認連接方式 在此使用 redis $this->registerManager(); //?注冊隊列各種命令 隊列連接 重啟等。 $this->registerWorker(); // 注冊隊列監聽命令 $this->registerListener(); // 5.1后棄用 $this->registerSubscriber(); // 注冊隊列失敗處理 $this->registerFailedJobServices(); // Register the Illuminate queued closure job. 什么用,后面再看。 $this->registerQueueClosure(); }任務創建與分配
php artisan make:job SendReminderEmail
按照文檔的方式生成了一個隊列任務類,該類繼承了 namespaceAppJobsJob, 實現了接口 SelfHandling 和 ShouldQueue , 或許你會問這兩個接口啥規范都沒規定啥用啊(先略過), 重點在兩個 trait 內,對隊列任務實現了各種操作,刪除,重試,延遲等。
在分配任務的時候我們使用了輔助函數 dispatch ,其實是 IlluminateBus 下 Dispatcher 類的 dispatch方法
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( "IlluminateContractsQueueShouldQueue" ); }
在此,我們先看下 namespace IlluminateBusBusServiceProvider 下的
public function register() { $this->app->singleton("IlluminateBusDispatcher", function ($app) { return new Dispatcher($app, function () use ($app) { // "queue.connection" => "IlluminateContractsQueueQueue", 再回看 QueueServiceProvider 的 registerManager 方法,就很清晰了。 return $app["IlluminateContractsQueueQueue"]; // 默認隊列連接 }); }); }
下面看 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); } }
上面任務進入隊列的整個流程就明白了。那任務出隊列呢?在文檔中我們可以看到,我們通過執行 php artisan queue:work 這條語句進行隊列的監聽,那在此就看下 namespace IlluminateQueueConsoleWorkCommand::fire(),夜很深了,下面自己看吧!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/22045.html
摘要:如果任務沒有在規定時間內完成,那么該有序集合的任務將會被重新放入隊列中。這兩個進程操縱了三個隊列,其中一個,負責即時任務,兩個,負責延時任務與待處理任務。如果任務執行成功,就會刪除中的任務,否則會被重新放入隊列中。 在實際的項目開發中,我們經常會遇到需要輕量級隊列的情形,例如發短信、發郵件等,這些任務不足以使用 kafka、RabbitMQ 等重量級的消息隊列,但是又的確需要異步、重試...
摘要:已經取消了參數,都用來執行。取數據的過程事物處理已經打開。取得符合條件的隊列后程序會更新該條數據,并且更新完后即。 connections => [ .... database => [ driver => database, table => jobs, queue => defaul...
摘要:使用開發的一個服務,是系統下的一個進程管理工具。一切就緒后,我們使用如下命令就可以啟動隊列進程的監聽了這里值得注意的是,如果處理隊列的代碼更改了,需要重啟的隊列管理才能生效。 supervisor使用python開發的一個client/server服務,是linux/unix系統下的一個進程管理工具。它可以很方便的監聽、停止、重啟一個或多個進程。用supervisor管理的進程,打你...
摘要:在使用中的隊列時,產生沖突干擾。文件中的配置部分至此,兩個項目的隊列沖突原因就找到了。隊列監聽最后遇到問題,莫要病急亂投醫。從代碼入手,分析理解實現原理,找對點,解決方法也許很簡單,。 問題 公司項目使用Laravel的開發的兩個項目在同一個測試服務器部署,公用同一個redis。在使用laravel中的隊列時,產生沖突干擾。 查找問題原因 在laravel 隊列的操作類 Illumin...
閱讀 3711·2023-04-25 22:43
閱讀 3706·2021-09-06 15:15
閱讀 1332·2019-08-30 15:54
閱讀 3543·2019-08-30 14:20
閱讀 2884·2019-08-29 17:16
閱讀 3117·2019-08-29 15:28
閱讀 3397·2019-08-29 11:08
閱讀 1071·2019-08-28 18:05