Как запустить команду artisan из задания в очереди, а затем удалить задание после выполнения с помощью драйвера базы данных

Я использую драйвер базы данных для постановки своих заданий в очередь. Мне нужно вызвать команду 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 никогда не вызывается. любая идея, что мне не хватает?


person simonecosci    schedule 24.10.2018    source источник
comment
Каков тайм-аут очереди и время выполнения вашего задания?   -  person Paras    schedule 24.10.2018
comment
'database' = ›['driver' =› 'database', 'table' = ›'jobs',» queue '= ›' default ',' retry_after '=› 90,], `   -  person simonecosci    schedule 24.10.2018
comment
среда выполнения задания представляет собой простой запрос с - ›get () и foreach с Mail :: to ($ address) -› send (new Newsletter ());   -  person simonecosci    schedule 24.10.2018


Ответы (1)


Вероятно, ваша работа не выполняется, и она добавляется в очередь, пытаясь завершить работу правильно. Попробуйте вызвать команду в своей работе вот так

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

Вместо того:

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

Где "your: command" - это имя команды, которое вы указали в классе команд:

protected $signature = 'email:send {user}';
person Виктор Митков    schedule 24.10.2018
comment
После правильного завершения задание должно исчезнуть из таблицы заданий. - person Виктор Митков; 24.10.2018