以下は、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);
}
ジョブがキューを離れるには、エラーや例外なしで、ハンドル関数の最後に到達する必要があります。
1つ以上の関数の内部で何かが壊れている必要があります。
ジョブの処理中に例外がスローされた場合、ジョブは自動的にキューに解放されるため、再試行できます。 https://laravel.com/docs/5.8/queues
同じ動作はで達成することができます
$this->release()
何が壊れているのかわからない場合は、ジョブを1回だけ実行するように設定できます。エラーがスローされた場合、ジョブは失敗したと見なされ、失敗したジョブのキューに入れられます。
最大試行回数は、
--tries
Artisanコマンドで使用される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キューを処理するときに失敗するのは普通です。どうやってここに来たと思いますか?
Laravelは何度も何度もジョブを実行しようとします。
php artisan queue:work --tries=3
Upperコマンドは、ジョブを3回だけ実行しようとします。
お役に立てれば
ジョブをキューにプッシュした後、ジョブを削除するために機能したソリューション。
たとえば、.
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;
}
}