Laravel 队列为一个作业保持多次处理

Laravel queue keep processing multiple times for a job

下面是当我 运行 php artisan queue:listen 而我的工作 table 只有一份工作时发生的事情

这是我的代码:

public function handle(Xero $xero)
{
        $this->getAndCreateXeroSnapshotID();
        $this->importInvoices($xero);
        $this->importBankTransaction($xero);
        $this->importBankStatement($xero); 
        $this->importBalanceSheet($xero);
        $this->importProfitAndLoss($xero);

}

Laravel 一次又一次地尝试 运行 这份工作。

php artisan queue:work --tries=3

上层命令只会尝试 运行 作业 3 次。

希望对您有所帮助

为了让作业离开队列,它必须到达句柄函数的末尾——没有错误和异常。

您的一个或多个函数中肯定有问题。

If an exception is thrown while the job is being processed, the job will automatically be released back onto the queue so it may be attempted again. https://laravel.com/docs/5.8/queues

可以使用

实现相同的行为
$this->release()

如果您无法弄清楚是什么问题,您可以将作业设置为 运行 一次。如果抛出错误,则该作业将被视为失败并被放入失败的作业队列中。

The maximum number of attempts is defined by the --tries switch used on the queue:work Artisan command. https://laravel.com/docs/5.8/queues

php artisan queue:work --tries=1

如果您正在使用数据库队列,(非常适合调试)运行 此命令用于创建失败队列 table

php artisan queue:failed

最后,找出你的代码有什么问题。您可以捕获并记录错误。

public function handle(Xero $xero)
{
    try{
        $this->getAndCreateXeroSnapshotID();
        $this->importInvoices($xero);
        $this->importBankTransaction($xero);
        $this->importBankStatement($xero); 
        $this->importBalanceSheet($xero);
        $this->importProfitAndLoss($xero);
    }catch(\Exception $e){
        Log::error($e->getMessage());
    }
}

您还可以将错误日志通道设置为 slack、bugsnag 或其他。请务必检查一下。请不要生气,在处理 laravel 队列时搞砸是正常的。你觉得我是怎么来的?

将作业推入队列后删除作业对我有用的解决方案。

考虑例如

class SomeController extends Controller{
  public function uploadProductCsv(){
   //process file here and push the code inot Queue
   Queue::push('SomeController@processFile', $someDataArray); 
  }

  public function processFile($job, $data){
    //logic to process the data
    $job->delete(); //after complete the process delete the job
  }

}

注意:这是针对 laravel 4.2

实施的

在我的例子中,问题是负载,我创建了变量 private,但它需要 protected

class EventJob implements ShouldQueue
{       
    use InteractsWithQueue, Queueable, SerializesModels;

    // payload
    protected $command;
    // Maximum tries of this event
    public $tries = 5;

    public function __construct(CommandInterface $command)
    {
        $this->command = $command;
    }

    public function handle()
    {
        $event = I_Event::create([
            'event_type_id' => $command->getEventTypeId(),
            'sender_url' => $command->getSenderUrl(),
            'sender_ip' => $command->getSenderIp()
        ]);

        return $event;
    }
}