dyrynda/terminable-jobs

允许您使您的 Laravel 队列作业可终止。

dev-main 2021-03-05 00:01 UTC

This package is auto-updated.

Last update: 2024-09-05 07:58:08 UTC


README

Terminable Jobs logo

Terminable jobs 是一个小型包,允许您暂停 Laravel 队列作业的执行。

使用示例

假设您有以下队列作业

class PromotionalCampaign implements ShouldQueue
{
    use InteractsWithQueue, Queuable;

    public function __construct()
    {
        // ...
    }

    public function handle()
    {
        // ...
    }
}

假设您已经将数千个作业排队,用于向用户发送促销活动邮件,但您发现促销本身有错别字或缺失链接。

您可能想执行 queue:flush,但如果您的作业在共享队列中,您将清除该队列上的 所有 作业,即使它们不是您想要的,这可能会导致处理丢失。

这就是 Terminable Jobs 的用武之地。

+ use Dyrynda\TerminableJobs\Terminable;

class PromotionalCampaign implements ShouldQueue
{
-    use InteractsWithQueue, Queuable;
+    use InteractsWithQueue, Terminable, Queuable;

     public function handle()
     {
+        $this->handleTermination();
         // ...
     }
+
+    protected function shouldTerminate(): bool
+    {
+        // Logic to determine if job should be terminated
+    }

如果 shouldTerminate() 返回 true,则 handleTermination() 方法将从您的队列中删除作业并抛出 JobWasTerminated 异常,这将阻止作业被处理。

在它的最简单形式中,您可以在应用程序中简单地定义一个配置变量,通过 .env 文件控制,来开启或关闭此功能。

// config/jobs.php
return [
    'promotional-campaign' => env('PROMOTIONAL_CAMPAIGN_ENABLED', true),
];

有了这个,您可以更新您的 shouldTerminate() 方法

     protected function shouldTerminate(): bool
     {
+        return config('jobs.promotional-campaign') === false;
     }

这意味着如果您需要停止处理 PromotionalCampaign 作业,您将更新 PROMOTIONAL_CAMPAIGN_ENABLED 环境变量为 false 并重启您的队列工作进程。任何挂起的作业将提前终止,抛出 JobWasTerminated 异常。

为了避免将异常报告给您的日志或错误跟踪软件,您可能希望将 JobWasTerminated 类添加到您忽略的异常列表中

// app/Exceptions/Handler.php
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
+ use Dyrynda\TerminableJobs\Exceptions\JobWasTerminated;

class Handler extends ExceptionHandler
{
     protected $dontReport = [
+        JobWasTerminated::class,
     ];

安装

composer require dyrynda/terminal-jobs

安装完成后,您可以在作业类中使用 Terminable 特性,并在您的作业类中实现 shouldTerminate(): bool 方法。

支持

如果您对这个包有任何一般性问题,请在 Twitter 上与我联系。

如果您认为您已经发现了一个问题,请使用 GitHub 问题跟踪器 报告它,或者更好的是,从存储库分支并提交一个 pull request。

如果您使用这个包,我很乐意听听您的想法。谢谢!

Treeware

您可以免费使用此包,但如果它进入您的生产环境,您需要为世界买一棵树。

众所周知,应对气候危机并防止我们的温度超过 1.5C 的最佳工具之一是种树。如果您支持此包并为 Treeware 森林做出贡献,您将为当地家庭创造就业机会并恢复野生动物栖息地。

您可以通过 这里 买树。

treeware.earth 上了解更多关于 Treeware 的信息