如何从排队的作业中启动工匠命令,然后使用数据库驱动程序执行后删除作业

时间:2018-10-24 13:41:49

标签: php laravel laravel-5 artisan

我正在使用数据库驱动程序来排队我的工作。 我需要从排队的作业中调用工匠命令,当作业完成后,我需要将其从队列中删除。 这是我的控制器代码,在其中将作业添加到队列中

dispatch((new SendNewsletter())->onQueue('newsletter'));

这是我排队的工作

<?php

namespace App\Jobs;

use App\Console\Commands\Newsletter;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;

class SendNewsletter implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct()
    {
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        app()->make(Newsletter::class)->handle();
    }
}

我需要调用的工匠命令是App\Console\Commands\Newsletter

,当作业结束时,应将其从队列中删除。 这是AppServiceProvider类

/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot() {
    Queue::after(function ($event) {
        if ($event->job->queue == 'newsletter') {
            $event->job->delete();
        }
    });
}

该作业已正确添加到数据库队列中,当我运行php artisan queue:work时,该作业被多次调用。 似乎从未调用Queue :: after的回调。 知道我想念什么吗?

1 个答案:

答案 0 :(得分:1)

您的工作可能失败,并且将其添加到队列中以尝试正确完成工作。尝试像这样在工作中调用命令

\Artisan::call('your:command');

代替:

app()->make(Newsletter::class)->handle();

其中“ your:command”是您在命令类中输入的命令名称:

protected $signature = 'email:send {user}';