8

以下是我运行 php artisan queue:listen 时发生的事情,并且在我的工作表上只有一份工作

在此处输入图像描述

这是我的代码:

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

}
4

4 回答 4

20

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

你的一个或多个函数中一定有什么东西出故障了。

如果在处理作业时抛出异常,该作业将自动释放回队列,以便再次尝试。https://laravel.com/docs/5.8/queues

可以通过以下方式实现相同的行为

$this->release()

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

最大尝试次数由Artisan 命令--tries上使用的开关定义。https://laravel.com/docs/5.8/queuesqueue:work

php artisan queue:work --tries=1

如果您使用的是数据库队列,(非常适合调试)运行此命令来创建失败的队列表

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 队列时搞砸是正常的。你觉得我是怎么来的?

于 2018-02-22T09:57:12.067 回答
7

Laravel 尝试一次又一次地运行该作业。

php artisan queue:work --tries=3

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

希望这可以帮助

于 2018-02-22T09:40:12.177 回答
1

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

考虑例如

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 实现的

于 2018-03-30T14:36:41.233 回答
1

就我而言,问题出在有效负载上,我创建了变量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;
    }
}
于 2018-10-25T14:33:54.763 回答