Php Laravel自定义队列不考虑重试\u之后

Php Laravel自定义队列不考虑重试\u之后,php,laravel,Php,Laravel,我在使用自定义laravel队列连接/队列时遇到一些问题。此特定连接/队列用于5分钟到10小时的作业(大型数据聚合和数据重建) 我有一个定义为 [program:laravel-worker-extended] process_name=%(program_name)s_%(process_num)02d command=php /var/www/artisan queue:work --queue=refreshQueue,rebuildQueue --sleep=3 --timeout=86

我在使用自定义laravel队列连接/队列时遇到一些问题。此特定连接/队列用于5分钟到10小时的作业(大型数据聚合和数据重建)

我有一个定义为

[program:laravel-worker-extended]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/artisan queue:work --queue=refreshQueue,rebuildQueue --sleep=3 --timeout=86400 --tries=2 --delay=360
autostart=true
autorestart=true
user=root
numprocs=4
redirect_stderr=true
stdout_logfile=/var/www/storage/logs/queue-worker.log
我的队列连接定义为:

        'refreshQueue' => [
            'driver' => 'database',
            'table' => 'jobs',
            'queue' => 'refreshQueue',
            'retry_after' => 420,   // Retry after 7 minutes
        ],
我正在通过以下命令向队列添加作业:

AggregateData::dispatch()->onConnection('refreshQueue')->onQueue('refreshQueue');
构造DatabaseQueue时,retryAfter是定义的420。但以下是我的工作日志:

[2020-01-22 18:25:37] local.INFO: BEGINNING AGGREGATION  
[2020-01-22 18:25:37] local.INFO: Aggregating data  
[2020-01-22 18:27:08] local.INFO: BEGINNING AGGREGATION  
[2020-01-22 18:27:08] local.ALERT: AGGREGATION FAILED: Aggregation in progress 
当我明确告诉它在420秒后重试时,为什么它会在90秒后继续重试

我已经重建了我的容器,重新启动了队列,并且做了所有我可以调试的事情。。。然后等待一段时间,我得到最后的日志输出:

[2020-01-22 18:25:37] local.INFO: BEGINNING AGGREGATION  
[2020-01-22 18:25:37] local.INFO: Aggregating data  
[2020-01-22 18:27:08] local.INFO: BEGINNING AGGREGATION  
[2020-01-22 18:27:08] local.ALERT: AGGREGATION FAILED: Aggregation in progress  
[2020-01-22 18:33:04] local.INFO: [COMPLETE] Aggregating data  
[2020-01-22 18:33:04] local.INFO: Queue job finishedIlluminate\Queue\CallQueuedHandler@call
我不太明白为什么队列在90秒后继续重试作业。我做错什么了吗

在此处编辑某些其他上下文:

此方法在开始时设置一个
in_progress
标志,以便不能在同一时间运行两次。这些日志可以解释为:

开始聚合
:作业的
句柄()方法的第一行

聚合失败:正在进行聚合
:作业的
FAILED()
方法通过异常处理失败。此行显示它已再次尝试该作业,并遇到设置为
1
的标志,这意味着当前正在处理另一个作业。当作业完成或遇到其他异常(未“进行中”)时,此标志将重置为0


Queue job finishedillumate\Queue\CallQueuedHandler@call
是我在服务提供程序中添加的进一步调试,用于侦听队列完成事件。

这可能与您使用的时间超时有关。从:

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


我已经解决了这个问题。在
queue.php
中,我定义了一个连接
刷新队列
。但是,在我的主管配置中,我使用了:

command=php /var/www/artisan queue:work --queue=refreshQueue,rebuildQueue --sleep=3 --timeout=86400 --tries=2 --delay=360
作为命令(
--queue
),其中该命令应为:

command=php /var/www/artisan queue:work refreshQueue --sleep=3 --timeout=86400 --tries=2 --delay=360
注意缺少
--queue
连接定义了
之后的
重试,\u,而不是队列本身


这是一个很有价值的教训。

您确定90秒后再次运行的是同一作业和同一队列吗?在进一步调试中,将此特定队列的
numprocs
调整为1是有效的,因为它在运行时不会重试。队列似乎没有“锁定”此进程,其他工作人员正在试图在其执行时拾取它。正如我在htop中检查的那样,正是同一组主管进程试图重新处理此问题。进一步调试:当登录
DatabaseQueue::getNextAvailableJob()
$this->retryAfter
时,由于某种原因设置为90。。xDebug似乎无法附加到队列工作者,但在初始作业创建时,我在该构造函数中有一个断点,
$retryAfter
是我在
queue.php
配置中设置的420。我已经清除了缓存并重新启动了workers,但就像Laravel忽略了设置一样。作业本身可以有一个变量$retryAfter,我想,这是为您设置的吗?设置作业级别
$retryAfter
确实有效,但我不想要求对这些作业进行如此精细的控制。设置该变量会将其放入
作业
表中的
有效负载
,但我希望在对类本身进行参数设置之前,默认行为首先能够正常工作。我最初在处理队列时遇到过这个问题,但到目前为止,我的超时时间是86400秒,我的作业运行时间不会超过5小时,但是最频繁的作业有大约5分钟的运行时间。