如何从队列执行作业?

时间:2018-10-25 15:13:21

标签: laravel laravel-queue

我正在使用Laravel Queue和数据库驱动程序来延迟某些任务。

但是,由于某些原因,我无法运行设计好的工作程序。取而代之的是,我决定使用调度程序每5分钟给自己的工作人员打电话。

但是,我不能真正理解如何实现工作程序,也无法完全理解原始代码。我想从数据库中检索到期的作业并运行它们。该怎么做?

是否有一些可以正常加载作业的通用模型,例如DatabaseJob::whereDate(......)->get()

我是否必须为工作加载某些东西(有效载荷?),或者它会自动发生?我需要执行哪些方法?处理?火?还是其他?

2 个答案:

答案 0 :(得分:1)

您可以为队列作业监视参考链接设置地平线:

https://laravel.com/docs/5.7/horizon

或者运行Artisan cmd

php artisan queue:listen database --queue=high

答案 1 :(得分:1)

您可以使用Artisan外观上的call()方法从代码中运行artisan命令。例如,这将处理默认队列中的所有就绪作业,并在完成后退出:

Artisan::call('queue:work', ['--stop-when-empty' => true])

来自docs

  

有时您可能希望在   CLI。例如,您可能希望从路线触发Artisan命令   或控制器。您可以在Artisan立面上使用call方法   完成这个。 call方法接受命令名称或   类作为第一个参数,命令参数数组作为   第二个论点。退出代码将返回:

Route::get('/foo', function () {
    $exitCode = Artisan::call('email:send', [
        'user' => 1, '--queue' => 'default'
    ]);

    // });

相同的语法适用于scheduling

$schedule->command('queue:work', [...])->everyFiveMinutes();

正如其他人指出的那样,在内部 schedule:run中运行工作程序可能会导致不良行为,例如跳过计划任务。

关于调度和运行排队作业的工作方式的问题,这是一个开始的地方:https://laravel.com/docs/5.7/queues