recherche

Maison  >  Questions et réponses  >  le corps du texte

La file d'attente Laravel 4 utilise beanstalkd, comment enregistrer dans la table failed_job en cas d'échec

Utilisez le superviseur pour surveiller les travaux dans la file d'attente,

php artisan queue:listen --timeout=0

Utilisation

php artisan queue:failed-table

L'enregistrement de la file d'attente ayant échoué a été établi, mais la situation actuelle est que celui qui a échoué est toujours exécuté à plusieurs reprises et n'est pas écrit dans failed_job

Dans la documentation Laravel

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

À quoi fait référence le nom de connexion ?

php artisan queue:listen --timeout=0 --tries=3, erreur d'exécution de la file d'attente

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

Comment résoudre ces problèmes ?

滿天的星座滿天的星座2738 Il y a quelques jours767

répondre à tous(2)je répondrai

  • 高洛峰

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

    Vous pouvez choisir parmi une variété de services de file d'attente dans Laravel, les plus courants sont Redis et Beanstalk. Puisque Redis est une simple base de données, les données sont complètement transparentes, il sera donc plus facile de comprendre si Redis est utilisé comme objet d'explication ici. .

    Les méthodes de démarrage de file d'attente dans Laravel incluent queue:listen et queue:work, où queue:work signifie exécuter le travail suivant séparément. différence Veuillez voir : la différence entre queue:listen et queue:work --daemon. queue:listen est également implémenté en interne en appelant encore et encore queue:work. Examinons maintenant la commande 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

    Avez-vous vu la méthode fire familière dans IlluminateQueueConsoleWorkCommand ? Oui c'est ça. Continuez à courir,
    Appelez la méthode runWork pour trouver le travail et l'exécuter. Il y a ici une option daemon, indiquant s'il faut s'exécuter en tant que démon. Considérez directement le démon comme faux (car le démon est en fait un while(true)) :joy:. 🎜 🎜Voyez que runWork appelle en fait la méthode IlluminateQueueWorker::pop🎜 rrreee 🎜Arrivé à la position finale d'exécution du travail (supprimé les lignes vides et les commentaires, car je vais écrire des commentaires chinois merdiques. (Escape):🎜 rrreee 🎜Eh bien, c’est à peu près tout. 🎜 🎜La Swift_TransportException que vous avez lancée était une erreur générée par le programme d'envoi d'e-mails swiftmailer🎜

    répondre
    0
  • phpcn_u1582

    phpcn_u15822017-05-16 16:58:46

    Dans la configuration des connexions dans config/queue.php, sync, beanstalkd, sqs, etc. sont le nom de la connexion.

    répondre
    0
  • Annulerrépondre