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