Laravel beantalkd在重试时间之前重复队列重复作业

时间:2019-05-01 18:00:18

标签: php laravel laravel-5.4 beanstalkd

我已经使用“ beanstalkd”队列驱动程序在Laravel 5.4上配置了一个队列...我将其部署在CentOS 7(cPanel)上并安装了Supervisor ...但是我有两个主要问题

  1. 在日志中,我发现此异常“ local.ERROR:异常'PDOException',消息为'SQLSTATE [42S02]:基表或视图未找到:1146表'{dbname} .failed_jobs'未找到存在”,因此问题#1 是..我应该为“ beanstalkd”队列驱动程序配置任何数据库表吗?如果可以,请说明这些表的结构吗?

  2. 我还按如下所示在Supervisor配置文件中配置了queue:work命令

[program:test-queue]
process_name=%(program_name)s_%(process_num)02d
command=php /home/****/****/artisan queue:work beanstalkd --sleep=3 --tries=3
autostart=true
autorestart=true
user=gcarpet
numprocs=8
redirect_stderr=true
stdout_logfile= /home/*****/*****/storage/logs/supervisor.log
  1. 我发现,即使在第一个呼叫“已处理”之后,supervisor.log仍包含多次呼叫。.问题2 ,我一次调度了该任务,但该任务已被推送多次进入队列,我需要一个解决方案来解决这个问题,我不想同一作业在队列中多次推送?

    [2019-05-14 09:08:15] Processing: App\Jobs\{JobName}
    [2019-05-14 09:08:15] Processing: App\Jobs\{JobName}
    [2019-05-14 09:08:15] Failed:     App\Jobs\{JobName}
    [2019-05-14 09:08:24] Processed:  App\Jobs\{JobName}
    [2019-05-14 09:08:24] Processing: App\Jobs\{JobName}
    [2019-05-14 09:08:33] Processed:  App\Jobs\{JobName}
    [2019-05-14 09:08:33] Processing: App\Jobs\{JobName}
    [2019-05-14 09:08:41] Processed:  App\Jobs\{JobName}
    [2019-05-14 09:08:41] Processing: App\Jobs\{JobName}
    [2019-05-14 09:08:41] Failed:     App\Jobs\{JobName}
    
    1. 请注意处理的作业和失败的作业之间的时差,另外,我已将驱动程序“ retry_after”设置为900一次,另一次设置为90。.我觉得这没有任何区别。

1 个答案:

答案 0 :(得分:2)

  1. 使用迁移为documented的方式创建表。
php artisan queue:failed-table
php artisan migrate
  1. 工作失败,所以是retried

此行为由队列工作人员在命令行中接收到的“ tries”选项指定

php artisan queue:work --tries=3

...或特定作业的tries属性。

<?php

namespace App\Jobs;

class Reader implements ShouldQueue
{
    public $tries = 5;
}

您当前看到作业重试3次,然后失败。 检查您的日志记录输出和failed_jobs表,以查看抛出了哪些异常并适当地修复了这些异常。

只要handle方法抛出,作业就会重试。 重试几次后,将fail作业和failed()方法被调用。 失败的作业将存储在failed_jobs表中,以供以后参考或manual retrying

  1. 还请注意:有一个超时和一个重试,需要分别设置。
  

--timeout值应始终至少比retry_after配置值短几秒钟。这将确保在重试作业之前,始终杀死处理给定作业的工人。如果您的--timeout选项比您的retry_after配置值长,则您的作业可能会被处理两次。

请参见Job Expirations & Timeouts