成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Laravel 隊列服務(wù)

Caizhenhao / 2095人閱讀

摘要:按照配置文件注冊一個默認(rèn)連接方式在此使用注冊隊列各種命令隊列連接重啟等。上面任務(wù)進(jìn)入隊列的整個流程就明白了。

看完文檔 后總想知道是怎么樣一個開始,又是怎樣的一個結(jié)束!圖片來源

QueueServiceProvider

Laravel 各種服務(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)了接口 SelfHandlingShouldQueue , 或許你會問這兩個接口啥規(guī)范都沒規(guī)定啥用啊(先略過), 重點在兩個 trait 內(nèi),對隊列任務(wù)實現(xiàn)了各種操作,刪除,重試,延遲等。
在分配任務(wù)的時候我們使用了輔助函數(shù) dispatch ,其實是 IlluminateBusDispatcher 類的 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

相關(guān)文章

  • laravel 隊列

    摘要:如果任務(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 等重量級的消息隊列,但是又的確需要異步、重試...

    BDEEFE 評論0 收藏0
  • Laravel5.2隊列驅(qū)動expire參數(shù)設(shè)置帶來的重復(fù)執(zhí)行問題 數(shù)據(jù)庫驅(qū)動

    摘要:已經(jīng)取消了參數(shù),都用來執(zhí)行。取數(shù)據(jù)的過程事物處理已經(jīng)打開。取得符合條件的隊列后程序會更新該條數(shù)據(jù),并且更新完后即。 connections => [ .... database => [ driver => database, table => jobs, queue => defaul...

    ysl_unh 評論0 收藏0
  • centos 7 使用supervisor 管理laravel 隊列

    摘要:使用開發(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)程,打你...

    only_do 評論0 收藏0
  • 分析Laravel隊列實現(xiàn)原理解決問題記錄

    摘要:在使用中的隊列時,產(chǎn)生沖突干擾。文件中的配置部分至此,兩個項目的隊列沖突原因就找到了。隊列監(jiān)聽最后遇到問題,莫要病急亂投醫(yī)。從代碼入手,分析理解實現(xiàn)原理,找對點,解決方法也許很簡單,。 問題 公司項目使用Laravel的開發(fā)的兩個項目在同一個測試服務(wù)器部署,公用同一個redis。在使用laravel中的隊列時,產(chǎn)生沖突干擾。 查找問題原因 在laravel 隊列的操作類 Illumin...

    Corwien 評論0 收藏0

發(fā)表評論

0條評論

Caizhenhao

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<