【问题标题】:Storing processed jobs from queue in laravel在 laravel 中从队列中存储已处理的作业
【发布时间】:2020-04-13 11:35:37
【问题描述】:

我正在处理队列,试图找到一种方法将已处理的作业记录在表“processed_jobs”中,就像失败的作业存储在表“failed_jobs”中一样,这是自动发生的。我正在使用“数据库”进行队列连接。我尝试了两种不同的方法。首先,我尝试在不同的命令文件 'WorkerCommand' 中扩展 WorkCommand ('Illuminate\Queue\Console\WorkCommand')

<?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 doc 所建议的那样,在我的 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']);
    }

【问题讨论】:

  • 你遇到什么样的错误?
  • 在您的 AppServiceProvider 中,进行日志调用以检查您的信息是否到达那里。在插入 Log::info([//event]); 之前
  • 我发现了问题。这是因为表中的“有效负载”列是长文本,但 $event-&gt;job-&gt;payload 正在返回对象。谢谢。

标签: php laravel


【解决方案1】:

这是因为 'processed_jobs' 表中的 'payload' 列是长文本,但 $event-&gt;job-&gt;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()
        ]);
    });
}

【讨论】:

    猜你喜欢
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-15
    • 2018-09-27
    相关资源
    最近更新 更多