[英]Check Laravel Jobs inside Queue::before to delete before they are processed
我想到了使用Queue :: before在AppServiceProvider中进行查看的方法,以此作为添加作业检查的一种方式,我不再希望运行并删除它们,而不必在我编写的每个作业中添加检查。
背景知识,我正在做一个进行审核的SaaS,因此审核可以运行数小时并且可以完成数千个工作。 如果我可以在作业通过时查找其内部的审核ID,并与已取消的所有审核ID的Cache数组进行比较,则可以节省时间。
因此,我要做的是如何在获取ID之前将作业在Queue ::: ww包装中? (普通的laravel Queues代码,并使用RabbitMQ)
由于作业被包裹在Event类的一两层中,因此我无法将数据转储到屏幕上查看,只能将其记录在队列中,仅用于记录文件。
在app / Providers / AppServiceProvider.php中:
Queue::before(function (JobProcessing $event) {
// $event->connectionName
// $event->job
$job = $event->job->payload();
$obj = unserialize($job['data']['data']);
}
就我感兴趣的事件而言,有效负载具有数据,该数据具有数据,即我感兴趣的序列化对象。这似乎不是最好的方法,或者不是看如何更好地与之交互方式。
谢谢
我正遇到涉及Webhook传递的类似问题。 通过开发人员门户,我们允许用户重新排队Webhook(以缩短等待后退交付尝试的等待时间)。 由于这可以为同一Webhook创建第二个作业,因此我们寻求一种方法来识别原始版本。
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()
来使其更加独特,以避免排队时潜在的双击问题或类似的打h。)
第二部分是我们设置半唯一的缓存键来匹配此queued_at
时间。 我将其设置为在3天后到期,超过了我们推迟的重试尝试的时间。
现在,当拿起一个作业进行处理时,我可以对照该缓存的值检查该作业实例的queued_at
属性,并删除旧的作业。
在我的AppServiceProvider
boot
方法中:
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()
方法。
注意:我仍然需要对此进行适当的测试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.