Хранение обработанных заданий из очереди в laravel - PullRequest
1 голос
/ 13 апреля 2020

Я работал над очередью, пытаясь найти способ записи обработанных заданий в таблицу «process_jobs» так же, как сбойные задания хранятся в таблице «failed_jobs», что происходит автоматически. Я использую «базу данных» для подключения к очереди. Я попробовал два разных метода. Сначала я попытался расширить WorkCommand ('Illuminate \ Queue \ Console \ WorkCommand') в другом командном файле 'WorkerCommand'

<?php

namespace App\Console\Commands;

use Illuminate\Queue\Console\WorkCommand;
use Illuminate\Contracts\Cache\Repository as Cache;
use Illuminate\Queue\Worker;
use Illuminate\Queue\Events\JobFailed;
use Illuminate\Queue\Events\JobProcessed;
use Illuminate\Queue\Events\JobProcessing;

class WorkerCommand extends WorkCommand
{
   protected function listenForEvents()
    {
        $this->laravel['events']->listen(JobProcessing::class, function ($event) {
            $this->writeOutput($event->job, 'starting');
        });

        $this->laravel['events']->listen(JobProcessed::class, function ($event) {
            $this->writeOutput($event->job, 'success');

            \DB::table('processed_jobs')->insert([
               'connection' => $event->connectionName,
               'queue' => $event->job->getQueue(),
               'payload' => $event->job->payload(),
               'processed_at' => \Carbon\Carbon::Now()
            ]);
        });

        $this->laravel['events']->listen(JobFailed::class, function ($event) {
            $this->writeOutput($event->job, 'failed');

            $this->logFailedJob($event);
        });
    }
}

Это не сработало. А потом я попытался использовать рабочие события. Как подсказывает this do c, в функции загрузки моего AppServiceProvider я попытался:

    public function boot()
    {
        Queue::after(function (JobProcessed $event) {
            \DB::table('processed_jobs')->insert([
               'connection' => $event->connectionName,
               'queue' => $event->job->getQueue(),
               'payload' => $event->job->payload(),
               'processed_at' => \Carbon\Carbon::Now()
            ]);
        });
    }

, что также не работало. Я не мог найти что-нибудь еще. Заранее спасибо. Вот файл задания:

<?php

namespace App\Jobs;

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

class ProcessSleep 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()
    {
        sleep(10);
    }
}

Функция, которая добавляет задание в очередь:

    public function dispatchSleep(){
        ProcessSleep::dispatch();

        return response()->json(['message'=>'Process added to queue']);
    }

1 Ответ

0 голосов
/ 13 апреля 2020

Это связано с тем, что столбец «полезная нагрузка» в таблице «process_jobs» имеет длинный текст, а $event->job->payload возвращал объект. Итак, я исправил это с помощью json_encode.

public function boot()
{
    Queue::after(function (JobProcessed $event) {
        \DB::table('processed_jobs')->insert([
           'connection' => $event->connectionName,
           'queue' => $event->job->getQueue(),
           'payload' => json_encode($event->job->payload()),
           'processed_at' => \Carbon\Carbon::Now()
        ]);
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...