在我的应用程序中,用户可以安排消息(如提醒),何时是时间,应用程序上会出现一个弹出窗口。为此,我创建了一个通知,我通过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;}',
),
)
答案 0 :(得分:0)
您可以在Queue::before
事件上运行回调。
在数据库中将提醒标记为已删除,然后在Queue::before
回调中,检查作业是否已被删除,如果已删除,请在处理之前从队列中删除该作业。
查看文档上的工作事件:https://laravel.com/docs/5.4/queues#job-events
<强> [编辑] 强>
刚看到你的编辑。如果您使用job->delete()
,则不应处理该作业这是否可能是延迟作业的错误?
此外,当您对类进行更改时,是否已停止并重新启动队列侦听器?我陷入了这个陷阱。