繁体   English   中英

为 Laravel 排队命令设置自定义超时

[英]Set custom timeout for Laravel queued command

我有一个这样的命令类。

class MyCommand extends Command {
    protected $signature = 'mycommand';
}

然后通过队列Artisan::queue('mycommand');运行它Artisan::queue('mycommand');

一个工人正在运行多个作业php artisan queue:work --timeout=120

通常,我们可以为这样的作业类设置自定义超时

class MyJob implements ShouldQueue {
    public $timeout = 240; // custom timeout
} 

但是如何在 Command 类中正确地实现这一点?

Artisan::queue不适合你的原因是因为实际调度的工作是: Illuminate\\Foundation\\Console\\QueuedCommand

查看\\Illuminate\\Foundation\\Console\\Kernel类上的queue方法

相反,您应该在使用::dispatch()方法时使用Dispatchable特性并实现ShouldQueue

这是一个简单的命令:

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;

class TestCommand extends Command implements ShouldQueue
{
    use Dispatchable;

    protected $signature = 'test:command';
    protected $description = 'Command description';
    public $timeout = 3;

    public function handle()
    {
        $count = 0;
        while (true) {
            sleep(1);
            dump($count++);
        }
    }
}

发送测试:

    /** @test */ // test
    public function test(){
        // given
        TestCommand::dispatch();

        // when

        // then
    }

和工人的输出(使用地平线)

2021-07-27 09:55:41][f80e9030-3f04-4148-a99c-42e0ae950947] Processing: App\Console\Commands\TestCommand
0
1
[2021-07-27 09:55:44][f80e9030-3f04-4148-a99c-42e0ae950947] Failed:     App\Console\Commands\TestCommand


暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM