Laravelキュージョブ、実行時間の前に実行


8

特定の日時(たとえば、明日)に実行されるLaravelジョブを作成しました。時間を上書きし、設定された実行時間の前にキューに入れられたジョブを実行する手動ボタンを追加したいと思います。ボタンをクリックすると、ajax呼び出しが作成され、ジョブIDがサーバーに送信されます。これにより、ジョブは明日ではなく今日実行されます。

次のコマンドを使用して、失敗したジョブを手動で再試行できます。 php artisan queue:retry JOBIDHERE

キューに入れられたジョブの実行に何を使用すればよいかわかりません。

ジョブIDを取得できますが、設定された実行時間より前にLaravelジョブを実行できるかどうかはわかりません。

私はGoogleで検索しましたが、そのような問題と解決策を持つ人は見つかりませんでした。

Laravel Ver 5.8を使用しています。Mysql 5.7の使用


更新:

以下は、キューに入れられたジョブのペイロードです。

Json Decodeを使用してデコードしましたが、そのキューのコマンドを更新して、キューの日付と時刻を更新し、キューに入れられたジョブレコードに保存できるかどうかはわかりません。

{"displayName":"App\\Jobs\\Payway\\UpdateCustomerInvestment","job":"Illuminate\\Queue\\CallQueuedHandler@call","maxTries":null,"delay":null,"timeout":null,"timeoutAt":null,"data":{"commandName":"App\\Jobs\\Payway\\UpdateCustomerInvestment","command":"O:40:\"App\\Jobs\\Payway\\UpdateCustomerInvestment\":17:{s:57:\"\u0000App\\Jobs\\Payway\\UpdateCustomerInvestment\u0000transactionType\";s:7:\"payment\";s:57:\"\u0000App\\Jobs\\Payway\\UpdateCustomerInvestment\u0000principalAmount\";d:9999;s:56:\"\u0000App\\Jobs\\Payway\\UpdateCustomerInvestment\u0000customerNumber\";s:4:\"BR-2\";s:50:\"\u0000App\\Jobs\\Payway\\UpdateCustomerInvestment\u0000currency\";s:3:\"aud\";s:58:\"\u0000App\\Jobs\\Payway\\UpdateCustomerInvestment\u0000singleUseTokenID\";N;s:55:\"\u0000App\\Jobs\\Payway\\UpdateCustomerInvestment\u0000payway_helper\";O:29:\"App\\Http\\Helpers\\PaywayHelper\":0:{}s:54:\"\u0000App\\Jobs\\Payway\\UpdateCustomerInvestment\u0000impodenceKey\";s:36:\"afedfc34-d08e-4831-a4aa-29de930d6b98\";s:49:\"\u0000App\\Jobs\\Payway\\UpdateCustomerInvestment\u0000headers\";a:0:{}s:60:\"\u0000App\\Jobs\\Payway\\UpdateCustomerInvestment\u0000localInvestmentObj\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":4:{s:5:\"class\";s:33:\"App\\Models\\Investment\\Investments\";s:2:\"id\";i:374;s:9:\"relations\";a:2:{i:0;s:8:\"investor\";i:1;s:13:\"investor.user\";}s:10:\"connection\";s:5:\"mysql\";}s:54:\"\u0000App\\Jobs\\Payway\\UpdateCustomerInvestment\u0000paywayTotals\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":4:{s:5:\"class\";s:38:\"App\\Models\\Banking\\Payway\\PaywayTotals\";s:2:\"id\";i:1;s:9:\"relations\";a:0:{}s:10:\"connection\";s:5:\"mysql\";}s:6:\"\u0000*\u0000job\";N;s:10:\"connection\";N;s:5:\"queue\";s:6:\"payway\";s:15:\"chainConnection\";N;s:10:\"chainQueue\";N;s:5:\"delay\";O:13:\"Carbon\\Carbon\":3:{s:4:\"date\";s:26:\"2019-11-12 23:35:22.752222\";s:13:\"timezone_type\";i:3;s:8:\"timezone\";s:16:\"Australia\/Sydney\";}s:7:\"chained\";a:0:{}}"}}

アップデート2:

ペイロードコマンドをデシリアライズすると、次の情報が得られました。

ここに画像の説明を入力してください

だから私はその遅延日を更新しようとしています、うまくいけばそれはうまくいくでしょう。

しかし、「Julian Stark」の回答から、available_atも更新する必要があるかもしれません。

私の理論では、キューが実行されると、に基づいてジョブが検索されavailable_atます。ただし、ジョブの実行中に遅延が発生すると、その特定の時間に実行されない可能性があります。この理論はまだテストされていません。

これら両方のdateTimeを更新し、すべてがスムーズに機能するかどうかを確認します。

回答:


11

同様の使用例では、ジョブのavailable_at時間を更新しただけなので、queue:listenコマンドはできるだけ早くジョブを実行します。

DB::table('jobs')->where('id', $jobId)->update(['available_at' => time()]);

これが正しい方法かどうかはわかりませんが、うまくいきました


新しい発見で私の質問を更新しました。ぜひチェックしてみてください。available_atについて言及していただきありがとうございます。
Sizzling Code、

私はpayload遅延を変更せずにlaravel 5.8で私の例をテストし、ジョブが実行されたため、Update 2で言及された理論は間違っています
Julian S

念のために変更time()DB::raw('NOW()')ます。
Styx

4

これを実現するには、最初にペイロードをデコードするだけです。

{
   "displayName":"App\\Jobs\\Payway\\UpdateCustomerInvestment",
   "job":"Illuminate\\Queue\\CallQueuedHandler@call",
   "maxTries":null,
   "delay":null,
   "timeout":null,
   "timeoutAt":null,
   "data":{
      "commandName":"App\\Jobs\\Payway\\UpdateCustomerInvestment",
      "command":"O:40:\"App\\Jobs\\Payway\\UpdateCustomerInvestment\":17:{s:57:\"\u0000App\\Jobs\\Payway\\UpdateCustomerInvestment\u0000transactionType\";s:7:\"payment\";s:57:\"\u0000App\\Jobs\\Payway\\UpdateCustomerInvestment\u0000principalAmount\";d:9999;s:56:\"\u0000App\\Jobs\\Payway\\UpdateCustomerInvestment\u0000customerNumber\";s:4:\"BR-2\";s:50:\"\u0000App\\Jobs\\Payway\\UpdateCustomerInvestment\u0000currency\";s:3:\"aud\";s:58:\"\u0000App\\Jobs\\Payway\\UpdateCustomerInvestment\u0000singleUseTokenID\";N;s:55:\"\u0000App\\Jobs\\Payway\\UpdateCustomerInvestment\u0000payway_helper\";O:29:\"App\\Http\\Helpers\\PaywayHelper\":0:{}s:54:\"\u0000App\\Jobs\\Payway\\UpdateCustomerInvestment\u0000impodenceKey\";s:36:\"afedfc34-d08e-4831-a4aa-29de930d6b98\";s:49:\"\u0000App\\Jobs\\Payway\\UpdateCustomerInvestment\u0000headers\";a:0:{}s:60:\"\u0000App\\Jobs\\Payway\\UpdateCustomerInvestment\u0000localInvestmentObj\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":4:{s:5:\"class\";s:33:\"App\\Models\\Investment\\Investments\";s:2:\"id\";i:374;s:9:\"relations\";a:2:{i:0;s:8:\"investor\";i:1;s:13:\"investor.user\";}s:10:\"connection\";s:5:\"mysql\";}s:54:\"\u0000App\\Jobs\\Payway\\UpdateCustomerInvestment\u0000paywayTotals\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":4:{s:5:\"class\";s:38:\"App\\Models\\Banking\\Payway\\PaywayTotals\";s:2:\"id\";i:1;s:9:\"relations\";a:0:{}s:10:\"connection\";s:5:\"mysql\";}s:6:\"\u0000*\u0000job\";N;s:10:\"connection\";N;s:5:\"queue\";s:6:\"payway\";s:15:\"chainConnection\";N;s:10:\"chainQueue\";N;s:5:\"delay\";O:13:\"Carbon\\Carbon\":3:{s:4:\"date\";s:26:\"2019-11-12 23:35:22.752222\";s:13:\"timezone_type\";i:3;s:8:\"timezone\";s:16:\"Australia\/Sydney\";}s:7:\"chained\";a:0:{}}"
   }
}

ペイロードをデコードすると、「コマンド」がシリアル化されていることがわかります。次に、「コマンド」のシリアル化を解除する必要があります。

[delay] => Array
        (
            [date] => 2019-11-12 23:35:22.752222
            [timezone_type] => 3
            [timezone] => Australia/Sydney
        )

その後、遅延ノードの下で日付を更新し、CarbonまたはPHPの日付を使用して、必要に応じて日付を更新できます。その後、「コマンド」ノードをシリアル化し、json_encodeペイロード全体をシリアル化して保存するだけです。

@Julian Starkの回答にも従う必要がありますavailable_at。つまり、そのジョブのを変更します。

これがお役に立てば幸いです。


1
私は同じプロセスをすでにたどり、両方の日付を更新しました。すでに完璧に働いています。
Sizzling Code

1

スケジュールされたジョブをフラッシュして今すぐディスパッチ機能を実行する代わりに、キューに入れられたジョブの時間を更新することは悪い習慣になります。


1
それも機能します。他の方法が悪い習慣である理由がわかりませんか?どちらの方法も私には問題ないようです。日付を直接更新するか、既存のジョブを削除してジョブを再度作成します。しかし、私は既存のジョブの日付/時刻をどのように更新できるかを見たかったのです。
Sizzling Code
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.