Laravel 5.8 Как получить идентификатор работы? - PullRequest
3 голосов
/ 03 мая 2019

Я пытаюсь получить идентификатор работы в моей работе.Я пытаюсь $this->job->getJobId(), но он возвращает пустую строку.

<?php

namespace App\Jobs\Notifications;

use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Support\Facades\Auth;

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

    public function __construct($notification, $fireShutdown)
    {
        $this->notification = $notification;
        $this->fireShutdown = $fireShutdown;
    }

    public function handle()
    {
        dd($this->job->getJobId());

       // Some Code
    }
}

Ответы [ 2 ]

1 голос
/ 03 мая 2019

Следующее позволит вам получить идентификатор задания.Попробуйте скопировать приведенный ниже код и отправить его по простому маршруту.

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

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        echo $this->job->getJobId();
    }
}

И следующий маршрут для его проверки.

Route::get('/trigger', function () {
    dd(dispatch(new \App\Jobs\TestJob()));
});

В вашем терминале вы должны увидеть следующее, с идентификатором вашей заданной работы.

Terminal returning the job id

Если ваш прослушиватель очереди не запущен, вы можете запустить его, набрав в терминале следующую команду

php artisan queue:work redis --tries=3

Если вы пытаетесь вернуть идентификатор своему контроллеру / маршруту, вы не можете сделать это с асинхронным / помещенным в очередь заданием из-за того, что он асинхронный / помещенный в очередь.

0 голосов
/ 04 июля 2019

Только что нашел этот ответ и, похоже, он все еще совместим с 5.8!

Файл маршрутов

Route::get('/queue/{count?}', function($count = 10) {
    $source = new stdClass;
    $source->count = $count;

    // dump(TestQueue::dispatch($source)->delay(now()->addSeconds(10)));
    dump(app(\Illuminate\Contracts\Bus\Dispatcher::class)->dispatch(new TestQueue($source)));

    return "Queued! Will loop {$source->count} times.";
});

Файл класса TestQueue

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

    protected $source;

    public function __construct(\stdClass $source)
    {
        $this->source = $source;
    }

    public function handle()
    {
        for ($i = 1; $i <= $this->source->count; $i++) {
            logger("Loop #{$i} of {$this->source->count}");
            sleep(1);
        }
    }
}

В браузере

Real database ID column!


ПРЕДУПРЕЖДЕНИЕ: Похоже, не может реализовать задержки. Он просто срабатывает всякий раз, когда вы называете это.

    dump(
        app(\Illuminate\Contracts\Bus\Dispatcher::class)
            ->dispatch(new TestQueue($source))
            ->delay(now()->addSeconds(10))
    );

ERROR: Call to a member function delay() on integer {"exception":"[object] (Symfony\\Component\\Debug\\Exception\\FatalThrowableError(code: 0): Call to a member function delay() on integer at ...web.php:50)"}

...