首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将队列中已处理的作业存储在laravel中

将队列中已处理的作业存储在laravel中
EN

Stack Overflow用户
提问于 2020-04-13 19:35:37
回答 1查看 1K关注 0票数 1

我在队列上工作,试图找到一种方法在表'processed_jobs‘中记录已处理的作业,就像失败的作业存储在表' failed _ jobs’中一样,这是自动发生的。我正在使用'database‘进行队列连接。我尝试了两种不同的方法。首先,我尝试在另一个命令文件'WorkerCommand‘中扩展WorkCommand ('Illuminate\Queue\Console\WorkCommand')。

代码语言:javascript
代码运行次数:0
运行
复制
<?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文档的建议,在我的AppServiceProvider的引导功能中,我尝试了:

代码语言:javascript
代码运行次数:0
运行
复制
    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()
            ]);
        });
    }

这也不起作用。我找不到其他的东西。提前谢谢。以下是作业文件:

代码语言:javascript
代码运行次数:0
运行
复制
<?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);
    }
}

将作业添加到队列的函数:

代码语言:javascript
代码运行次数:0
运行
复制
    public function dispatchSleep(){
        ProcessSleep::dispatch();

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-14 00:30:51

这是因为'processed_jobs‘表中的'payload’列是长文本,但$event->job->payload返回的是object。因此,我使用json_encode修复了它。

代码语言:javascript
代码运行次数:0
运行
复制
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()
        ]);
    });
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61187015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档