繁体   English   中英

在处理之前检查Queue :: before中的Laravel Jobs以便删除

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM