gpt4 book ai didi

php - 在 laravel 中存储来自队列的已处理作业

转载 作者:行者123 更新时间:2023-12-05 06:18:39 25 4
gpt4 key购买 nike

我正在研究队列,试图找到一种方法来在表“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']);
}

最佳答案

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

关于php - 在 laravel 中存储来自队列的已处理作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61187015/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com