【问题标题】:Handle Method not being called in Laravel Redis QueueLaravel Redis 队列中未调用处理方法
【发布时间】:2021-09-29 09:27:24
【问题描述】:

向队列中添加项目时,由于某种原因未调用句柄方法。

__construct 中的 Log 条目正在出现,但是当尝试登录 handle() 时,什么也没有出现。

我用来调度的方法是ProcessImport::dispatch($path, $task->task_id);

我的队列服务被配置为使用 Redis,redis 正在相应地存储所有数据。

我正在使用 Laravel 8。可能出了什么问题?

<?php

namespace App\Jobs;

use App\Models\Tasks;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use App\Http\Controllers\Products\Products;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Queue;
use Illuminate\Queue\Events\JobProcessing;
use Illuminate\Queue\Events\JobProcessed;
use Throwable;
class ProcessImport implements ShouldQueue, ShouldBeUnique
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $file_path;
    protected $response;
    protected $task;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct($path, $task_id)
    {
        Log::info("Importing products (construct)");
        $this->task = Tasks::where('task_id', $task_id)->first();
        $this->file_path = $path;
        Log::info('Importing ' . $path);
    }

    private function getFilePath() {
        return $this->file_path;
    }

    /**
     * Handle a job failure.
     *
     * @param  \Throwable  $exception
     * @return void
     */
    public function failed(Throwable $exception)
    {
        $this->task->failed($exception->getMessage());
    }

    /**
     * Get the cache driver for the unique job lock.
     *
     * @return \Illuminate\Contracts\Cache\Repository
     */
    public function uniqueVia()
    {
        return Cache::driver('redis');
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        Log::info("Importing products (handle)");
        $this->task->start();
        $products = new Products();
        $products->importProductsFromCSV($this->getFilePath());
        $this->task->success();
        Log::info("End of importing products..");
    }
}

【问题讨论】:

  • 你跑php artisan queue:work了吗?
  • 这是后台进程吗?它究竟是如何工作的?我一定在文档中错过了它。
  • 感谢@CuongLeNgoc - 随意发布答案并选择它。

标签: php laravel redis queue


【解决方案1】:

您刚刚将作业推送到队列中,但还没有启动工作人员来处理它们。您可以使用以下方式运行工作者:

php artisan queue:work

【讨论】:

    猜你喜欢
    • 2016-03-04
    • 1970-01-01
    • 2015-03-15
    • 2019-01-02
    • 1970-01-01
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多