cari

Rumah  >  Soal Jawab  >  teks badan

Baris gilir Laravel 4 menggunakan beanstalkd, cara merekod ke jadual failed_job apabila gagal

Gunakan penyelia untuk memantau kerja dalam baris gilir,

php artisan queue:listen --timeout=0

Gunakan

php artisan queue:failed-table

Rekod giliran yang gagal telah diwujudkan, tetapi keadaan semasa ialah yang gagal sentiasa dilaksanakan berulang kali dan tidak ditulis kepada failed_job

Dalam dokumentasi laravel

php artisan queue:listen connection-name --tries=3

Apakah yang dimaksudkan dengan nama sambungan?

php artisan queue:listen --timeout=0 --try=3, queue execution error

exception 'Swift_TransportException' with message 'Expected response code 250 but got code "", with message ""'

Bagaimana untuk menyelesaikan masalah ini?

滿天的星座滿天的星座2828 hari yang lalu825

membalas semua(2)saya akan balas

  • 高洛峰

    高洛峰2017-05-16 16:58:46

    Anda boleh memilih daripada pelbagai perkhidmatan giliran dalam laravel, yang biasa adalah redis dan beanstalk Memandangkan redis adalah db yang mudah, datanya benar-benar telus, jadi lebih mudah difahami jika redis digunakan sebagai objek penjelasan di sini. .

    Kaedah permulaan baris gilir dalam laravel termasuk queue:listen dan queue:work, dengan queue:work bermaksud menjalankan tugas seterusnya secara berasingan perbezaan Sila lihat: perbezaan antara queue:listen dan queue:work --daemon. queue:listen juga dilaksanakan secara dalaman dengan memanggil queue:work lagi dan lagi Sekarang mari kita lihat perintah work. queue:listenqueue:work, 其中queue:work表示单独运行下一个job. 关于区别请看:queue:listen 和 queue:work --daemon 的区别 。queue:listen内部也是一次次的调用queue:work实现的,现在我们来看work命令。

    IlluminateQueueConsoleWorkCommand中是不是看见了我们熟悉的fire方法?对就是它。继续追,
    调用runWork方式查找job并且执行.这里有一个daemon选项, 表示是否作为守护运行。直接将daemon认为false(因为daemon其实就是一个while(true) ):joy:。

    看到runWork其实是调用的IlluminateQueueWorker::pop方法

    public function pop($connectionName, $queue = null, $delay = 0, $sleep = 3, $maxTries = 0)
    {
        $connection = $this->manager->connection($connectionName); //这里就是你说的连接名称,实际就是选择一个合理的queue服务,只要你没有用某个队列服务的特有的方法,那么各个队列可以随时切换使用的.
    
        $job = $this->getNextJob($connection, $queue);  //查找一个job对象
    
        // If we're able to pull a job off of the stack, we will process it and
        // then immediately return back out. If there is no job on the queue
        // we will "sleep" the worker for the specified number of seconds.
        if ( ! is_null($job))
        {
            //如果job存在则执行任务
            return $this->process(
                $this->manager->getName($connectionName), $job, $maxTries, $delay
            );
        }
        $this->sleep($sleep);
        return ['job' => null, 'failed' => false];
    }
    

    到了最终执行job的位置(删掉了空行和注释,因为我要来上蹩脚的中文注释了.(逃 ):

    public function process($connection, Job $job, $maxTries = 0, $delay = 0)
    {
        if ($maxTries > 0 && $job->attempts() > $maxTries){ //看见了吗,运行的时候先查看了job的执行次数如果超过了最大次数,则直接进入logFailedJob过程,也就是将失败的job存储到指定的数据库中, 观察`Illuminate\Queue\Jobs\RedisJob`中的`attempts `方法和`release`方法。一个查看attempts次数,一个增加attempts次数(当然release还有其他操作).那么找找谁调用了release方法(看下面的trycatch,就是在出现异常之后并且job没有被删除的情况下会调用release)?如果没有抛出异常?那么attempts是不会变化的。
            return $this->logFailedJob($connection, $job); 
        }
        try{
            $job->fire();// job的fire方法实际已经将我们指定的JobClass用Container::make并且执行了fire方法.
            if ($job->autoDelete()) $job->delete();
            return ['job' => $job, 'failed' => false];
        } catch (\Exception $e){
            if ( ! $job->isDeleted()) $job->release($delay);
    
            throw $e;
        }
    }
    

    恩,差不多就是这么回事了。

    你那个抛出来的Swift_TransportException是发送邮件程序swiftmailer

    Adakah anda melihat kaedah fire yang biasa dalam IlluminateQueueConsoleWorkCommand? Ya itu sahaja. Teruskan mengejar,
    Panggil kaedah runWork untuk mencari kerja dan laksanakannya Terdapat pilihan daemon di sini, menunjukkan sama ada untuk dijalankan sebagai daemon. Secara langsung menganggap daemon sebagai palsu (kerana daemon sebenarnya adalah sementara(benar)):joy:. 🎜 🎜Lihat bahawa runWork sebenarnya memanggil kaedah IlluminateQueueWorker::pop🎜 rrreee 🎜Tiba di kedudukan pelaksanaan akhir kerja (memadamkan baris dan komen kosong, kerana saya akan menulis komen bahasa Cina yang buruk. (Escape):🎜 rrreee 🎜Nah, itu sahaja. 🎜 🎜 Swift_TransportException yang anda lemparkan ialah ralat yang dilemparkan oleh program penghantaran e-mel swiftmailer🎜

    balas
    0
  • phpcn_u1582

    phpcn_u15822017-05-16 16:58:46

    Dalam konfigurasi sambungan dalam config/queue.php, sync, beanstalkd, sqs, dll. ialah nama sambungan.

    balas
    0
  • Batalbalas