Laravel - 如何删除作业(通知)

时间:2017-07-27 14:22:26

标签: php laravel laravel-5

在我的应用程序中,用户可以安排消息(如提醒),何时是时间,应用程序上会出现一个弹出窗口。为此,我创建了一个通知,我通过Websocket发送它。

现在,假设use使用了错误的日期(或者只是想要更改提醒日期),我需要在执行之前访问JOB。

我确实尝试了很多解决方案,但没有效果......

我的通知类是:

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

在RemindNote上尝试处理方法:

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

激活php artisan queue:work,当我安排通知时,永远不会调用handle方法。

尝试 Queue::before AppServiceProvider

调用此方法但是如果我调用$event->job->delete(),则通常会触发通知 - 删除作业。但是,如果我打电话给$event->job->release(),则会重新安排作业

那么,有一种方法可以访问JOB有效负载并在执行之前删除它吗?

修改

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

有了这个,当处理作业时,我在laravel.log中看到了这个:

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

并且,通知始终被触发。似乎钩子之前的delete()没有效果。

修改 这是在Queue ::之前登录的有效负载(方法$ event-> job-> payload()):

[2017-07-27 15:00:13] stage.INFO: array (
  'job' => 'Illuminate\\Queue\\CallQueuedHandler@call',
  '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;}',
  ),
)  

1 个答案:

答案 0 :(得分:0)

您可以在Queue::before事件上运行回调。

在数据库中将提醒标记为已删除,然后在Queue::before回调中,检查作业是否已被删除,如果已删除,请在处理之前从队列中删除该作业。

查看文档上的工作事件:https://laravel.com/docs/5.4/queues#job-events

<强> [编辑] 刚看到你的编辑。如果您使用job->delete(),则不应处理该作业这是否可能是延迟作业的错误?

此外,当您对类进行更改时,是否已停止并重新启动队列侦听器?我陷入了这个陷阱。