2017-03-26 7 views
2

私は、ジョブのチェックを追加するための方法として、Queue :: beforeをAppServiceProviderで検索するアイディアを与えられました。私が書いたすべての仕事に小切手を加える必要はありません。
バックグラウンドでは、監査を実行するSaaSに取り組んでいます。そのため、監査は何時間も実行され、1000件のジョブが実行されます。ジョブ内の監査IDを調べて、取り消された監査IDのキャッシュ配列と比較すると、時間を節約できます。キュー内のLaravelジョブを確認::前に削除する処理をする

だから私はどのようにジョブをキューでアンラップするのですか::チェックするIDを取得する前に? (通常のlaravelは、コードをキューに入れ、RabbitMQを使用します)

ジョブは1つまたは複数のイベントクラスにラップされているため、ログファイルだけを表示するためにデータを画面にダンプできませんキュー。アプリ/プロバイダ/ AppServiceProvider.phpで

Queue::before(function (JobProcessing $event) { 
    // $event->connectionName 
    // $event->job 
    $job = $event->job->payload(); 
    $obj = unserialize($job['data']['data']); 
} 

は限りそれは私がペイロードを面白いしていたイベントのためにのように見えるように、データを持っているデータを、持っている、それは私が興味を持ってシリアライズされたオブジェクトでありますこれは最善の方法ではなく、より良いやり方でそれとやりとりする方法を見ているようです。

ありがとうございました

+0

どのように各ジョブファイルphpのチェックをコード化するのではなく、各ジョブでキーの1か所にチェックを書き込むことができますか? – tristanbailey

答えて

0

私はwebhook配信に関する同様の問題の真っ只中です。デベロッパーポータルを通じて、ユーザーはWebhookを再キューに入れることができます(バックオフ配信の試行待ちを短時間で切断できます)。同じWebhookの2番目のジョブが作成される可能性があるため、オリジナルを古いものとして識別する方法を探しました。

app/Jobs/DeliverWebhook.phpコンストラクタ:ここ

public function __construct(Webhook $webhook) 
{ 
    $this->webhook  = $webhook; 
    $this->queued_at = Carbon::now(); 

    Cache::put(
     'DeliverWebhook.'. $this->webhook->id .'.QueuedAt', 
     $this->queued_at, 
     Carbon::now()->addDays(3) 
    ); 
} 

、あなたは私たちが仕事のこのインスタンスにqueued_at属性を添付しました見ることができます。 (uniqid()またはrandom_bytes()のようなものを使用することでユニークにすることもできます)。

2番目の部分は、半固有キャッシュキーを一致させることですこのqueued_at時間。私は3日後に期限切れになるように設定しました。これは、バックオフされた再試行の最後を過ぎてからです。

ここで、処理のためにジョブが選択されると、ジョブインスタンスのqueued_at属性をキャッシュされた値と照合して、ジョブが古い場合はそのジョブを削除できます。私AppServiceProviderboot方法で

Queue::before(function ($event) { 
    if ($event->job->queue == 'webhooks' && $event->job->getName() == 'DeliverWebhook') { 
     $cache_key = 'DeliverWebhook.'. $event->job->instance->webhook->id .'QueuedAt'; 

     if ($event->job->instance->queued_at < Cache::get($cache_key)) { 
      $event->job->delete(); 

      throw new JobRequeuedException; 
     } 
    } 
}); 

ジョブが$job->fire()を呼び出す前に削除された場合、キュー労働者は、デフォルトでは、チェックしないため、例外が最後にスローされます。例外をスローすると、作業者はfire()をスキップし、handleJobException()メソッドにジャンプします。

注:これを適切にテストする必要があります。

+0

これは技術的にはLaravel 5.5のソリューションですが、他のバージョンでも動作する可能性があります。 – Trip

関連する問題