web-dev-qa-db-ja.com

Laravelキューはジョブに対して複数回処理を続けます

以下は、php artisan queue:listenを実行したときに何が起こっているかです。

enter image description here

これが私のコードです:

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

}
4
bathulah mahir

ジョブがキューを離れるには、エラーや例外なしで、ハンドル関数の最後に到達する必要があります。

1つ以上の関数の内部で何かが壊れている必要があります。

ジョブの処理中に例外がスローされた場合、ジョブは自動的にキューに解放されるため、再試行できます。 https://laravel.com/docs/5.8/queues

同じ動作はで達成することができます

$this->release()

何が壊れているのかわからない場合は、ジョブを1回だけ実行するように設定できます。エラーがスローされた場合、ジョブは失敗したと見なされ、失敗したジョブのキューに入れられます。

最大試行回数は、--triesArtisanコマンドで使用されるqueue:workスイッチによって定義されます。 https://laravel.com/docs/5.8/queues

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キューを処理するときに失敗するのは普通です。どうやってここに来たと思いますか?

16
Magus

Laravelは何度も何度もジョブを実行しようとします。

php artisan queue:work --tries=3

Upperコマンドは、ジョブを3回だけ実行しようとします。

お役に立てれば

4
Adnan Mumtaz

ジョブをキューにプッシュした後、ジョブを削除するために機能したソリューション。

たとえば、.

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に実装されています

2
Amit Sharma

私の場合、問題はペイロードでした。変数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;
    }
}