2017-07-27 10 views
1

私のアプリケーションでは、ユーザはメッセージ(リマインダーのような)をスケジュールすることができ、時刻はアプリケーションにポップアップが表示されます。このために、私は通知を作成し、Websocketを通じてこれを送信します。Laravel - ジョブを削除する方法(通知)

ここで、間違った日付を挿入した場合(または単に思い出しの日付を変更したい場合)、これが実行される前にJOBにアクセスする必要があるとします。

私は多くの解決策を試してみました、ない作品...

私の通知クラスがある:

class RemindNote extends Notification implements ShouldQueue, ShouldBroadcast 
{ 
    use Queueable; 
    use InteractsWithQueue; 
} 

RemindNote試着ハンドル方法:アクティブにphp artisan queue:workを持つ

public function handle($event) { 
    $this->delete(); 
} 

私が通知をスケジュールするとき、handleメソッドは決して呼び出されません。

は、このメソッドが呼び出され AppServiceProvider

Queue::beforeを試みたが、私は$event->job->delete()を呼び出す場合、通知が常に発射される - ジョブが削除されました。しかし、例えば私が$event->job->release()を呼び出すと、ジョブは再スケジュールされます

したがって、実行前にJOBペイロードにアクセスして削除する方法がありますか?

仕事は私がlaravel.logでこれを見て処理されたEDITこれにより

\Queue::before(function(JobProcessing $event) { 
    \Log::debug($event->job->isDeleted()); 
    $event->job->delete(); 
}); 

は、:

[2017-07-27 16:44:35] stage.DEBUG: 
[2017-07-27 16:44:36] stage.DEBUG: 

そして、通知が常に発射されます。前のフックのdelete()は効果がないようです。

EDIT これは、ペイロードは、キューにログイン::(メソッド$ event-> job->ペイロード())の前にある:

[2017-07-27 15:00:13] stage.INFO: array (
    'job' => 'Illuminate\\Queue\\[email protected]', 
    'data' => 
    array (
    'commandName' => 'Illuminate\\Notifications\\SendQueuedNotifications', 
    'command' => 'O:48:"Illuminate\\Notifications\\SendQueuedNotifications":6:{s:14:"' . "\0" . '*' . "\0" . 'notifiables";O:45:"Illuminate\\Contracts\\Database\\ModelIdentifier":2:{s:5:"class";s:26:"App\\Repositories\\User\\User";s:2:"id";a:1:{i:0;i:29;}}s:15:"' . "\0" . '*' . "\0" . 'notification";O:28:"App\\Notifications\\RemindNote":7:{s:4:"body";s:3:"ddf";s:4:"user";O:45:"Illuminate\\Contracts\\Database\\ModelIdentifier":2:{s:5:"class";s:26:"App\\Repositories\\User\\User";s:2:"id";i:29;}s:2:"id";s:36:"e160802c-e9e5-4d2c-a1e1-d63cbdceb54c";s:10:"connection";N;s:5:"queue";N;s:5:"delay";O:13:"Carbon\\Carbon":3:{s:4:"date";s:26:"2017-07-27 14:31:00.000000";s:13:"timezone_type";i:3;s:8:"timezone";s:11:"Europe/Rome";}s:6:"' . "\0" . '*' . "\0" . 'job";N;}s:11:"' . "\0" . '*' . "\0" . 'channels";a:1:{i:0;s:9:"broadcast";}s:10:"connection";N;s:5:"queue";N;s:5:"delay";r:14;}', 
), 
) 
[2017-07-27 15:00:13] stage.INFO: array (
    'job' => 'Illuminate\\Broadcasting\\BroadcastEvent', 
    'data' => 
    array (
    'event' => 'O:60:"Illuminate\\Notifications\\Events\\BroadcastNotificationCreated":6:{s:10:"notifiable";O:45:"Illuminate\\Contracts\\Database\\ModelIdentifier":2:{s:5:"class";s:26:"App\\Repositories\\User\\User";s:2:"id";i:29;}s:12:"notification";O:28:"App\\Notifications\\RemindNote":7:{s:4:"body";s:3:"ddf";s:4:"user";O:45:"Illuminate\\Contracts\\Database\\ModelIdentifier":2:{s:5:"class";s:26:"App\\Repositories\\User\\User";s:2:"id";i:29;}s:2:"id";s:36:"e160802c-e9e5-4d2c-a1e1-d63cbdceb54c";s:10:"connection";N;s:5:"queue";N;s:5:"delay";O:13:"Carbon\\Carbon":3:{s:4:"date";s:26:"2017-07-27 14:31:00.000000";s:13:"timezone_type";i:3;s:8:"timezone";s:11:"Europe/Rome";}s:6:"' . "\0" . '*' . "\0" . 'job";N;}s:4:"data";a:1:{s:4:"body";s:3:"ddf";}s:10:"connection";N;s:5:"queue";N;s:5:"delay";N;}', 
), 
) 
+0

キューから削除する必要があります。どのようにすれば*使用しているキューエンジンによって異なりますか? – ceejayoz

+0

データベースキューを使用しています – Mistre83

+0

データベース内のレコードを検索して削除できます。 – ceejayoz

答えて

0

あなたはQueue::beforeイベントにコールバックを実行することができます。

リマインダーをデータベースで削除してマークし、次にQueue::beforeコールバックで、ジョブが削除されているかどうかを確認します。削除されている場合は、キューからジョブを削除してから処理します。 https://laravel.com/docs/5.4/queues#job-events

[編集] だけ見て、あなたの編集:

は、ドキュメント上のジョブイベントを参照してください。 job->delete()を使用すると、ジョブが処理されるべきではありません。遅延ジョブのバグである可能性がありますか?

また、クラスを変更するときにキューリスナーを停止して再起動しましたか?私はこの罠に陥った。

+0

私はQueue :: before内で$ job-> delete()を実行しますが、ジョブは常に実行されます。さて、私はisDeleted()でログを配置し、その後、私はdelete()を呼び出し、ログは空の行を表示します。私の編集を参照してください – Mistre83

+0

確かに、私は労働者を数回再起動しました。 – Mistre83

+0

@ Mistre83あなたはそこにあるものを見るためにイベント全体をログにダンプしようとしましたか? – Joe

関連する問題