我正在使用数据库驱动程序来排队我的工作。 我需要从排队的作业中调用工匠命令,当作业完成后,我需要将其从队列中删除。 这是我的控制器代码,在其中将作业添加到队列中
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的回调。
知道我想念什么吗?
答案 0 :(得分:1)
您的工作可能失败,并且将其添加到队列中以尝试正确完成工作。尝试像这样在工作中调用命令
\Artisan::call('your:command');
代替:
app()->make(Newsletter::class)->handle();
其中“ your:command”是您在命令类中输入的命令名称:
protected $signature = 'email:send {user}';