触发多个作业的Nova队列动作

问题描述 投票:0回答:1

我已经创建了一个这样的动作。

use Illuminate\Bus\Queueable;
use Laravel\Nova\Actions\Action;
use Illuminate\Support\Collection;
use Laravel\Nova\Fields\ActionFields;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Laravel\Nova\Fields\BelongsTo;
use Illuminate\Support\Facades\Queue;

class ExportToCsv extends Action implements ShouldQueue
{
    use InteractsWithQueue, Queueable;

    public function handle(ActionFields $fields, Collection $models)
    {
        var_dump(time(), collect($models)->map(function($item){
            return $item->id;
        })->first());

        sleep(3);
    }
}

然后我对1128件物品进行触发(两次),并观察其结果。

[2020-05-02 20:45:05][181] Processing: App\Nova\Actions\ExportToCsv
int(1588452305)
int(621525)
[2020-05-02 20:45:05][180] Processing: App\Nova\Actions\ExportToCsv
int(1588452305)
int(412186)
[2020-05-02 20:45:05][179] Processing: App\Nova\Actions\ExportToCsv
int(1588452305)
int(621282)
[2020-05-02 20:45:08][181] Processed:  App\Nova\Actions\ExportToCsv
[2020-05-02 20:45:08][184] Processing: App\Nova\Actions\ExportToCsv
int(1588452308)
int(623886)
[2020-05-02 20:45:08][180] Processed:  App\Nova\Actions\ExportToCsv
[2020-05-02 20:45:08][182] Processing: App\Nova\Actions\ExportToCsv
int(1588452308)
int(622950)
[2020-05-02 20:45:08][179] Processed:  App\Nova\Actions\ExportToCsv
[2020-05-02 20:45:08][183] Processing: App\Nova\Actions\ExportToCsv
int(1588452308)
int(623252)
[2020-05-02 20:45:11][184] Processed:  App\Nova\Actions\ExportToCsv
[2020-05-02 20:45:11][182] Processed:  App\Nova\Actions\ExportToCsv
[2020-05-02 20:45:11][183] Processed:  App\Nova\Actions\ExportToCsv
[2020-05-02 20:45:35][185] Processing: App\Nova\Actions\ExportToCsv
int(1588452335)
int(621282)
[2020-05-02 20:45:35][187] Processing: App\Nova\Actions\ExportToCsv
int(1588452335)
int(621525)
[2020-05-02 20:45:35][186] Processing: App\Nova\Actions\ExportToCsv
int(1588452335)
int(412186)
[2020-05-02 20:45:38][185] Processed:  App\Nova\Actions\ExportToCsv
[2020-05-02 20:45:38][188] Processing: App\Nova\Actions\ExportToCsv
int(1588452338)
int(622950)
[2020-05-02 20:45:38][187] Processed:  App\Nova\Actions\ExportToCsv
[2020-05-02 20:45:38][190] Processing: App\Nova\Actions\ExportToCsv
int(1588452338)
int(623886)
[2020-05-02 20:45:38][186] Processed:  App\Nova\Actions\ExportToCsv
[2020-05-02 20:45:38][189] Processing: App\Nova\Actions\ExportToCsv
int(1588452338)
int(623252)
[2020-05-02 20:45:41][188] Processed:  App\Nova\Actions\ExportToCsv
[2020-05-02 20:45:41][190] Processed:  App\Nova\Actions\ExportToCsv
[2020-05-02 20:45:41][189] Processed:  App\Nova\Actions\ExportToCsv

默认情况下,批处理是按200个项目分组的 我看到同时有3个作业被产生。不幸的是没有办法知道哪个作业会先被处理,所以日志中显示的每个批次的模型都会发生变化,从输出中可以看到。621525, 412186, 621282 当第一次调用行动时 621282, 621525, 412186 当它第二次被调用时(模型在作业之间以同样的方式分割,但处理作业的顺序会改变)。这里的问题是,如果我把视图保存到CSV文件中,顺序很重要。

我希望在给定的时间内,给定的动作只产生一个作业,这样就可以解决我的问题。这可能吗?

使用 horizon 作为队列工作者

laravel-nova laravel-horizon
1个回答
0
投票

实现这个目标的方法是改变 processes 地平线配置中的值。

    'environments' => [
        'local' => [
            'supervisor-1' => [
                'connection' => 'redis',
                'queue' => ['default'],
                'balance' => 'simple',
                'processes' => 1,
                'tries' => 3,
            ],
        ],
© www.soinside.com 2019 - 2024. All rights reserved.