簡體   English   中英

如何使 Laravel 作業在不重新啟動的情況下失敗,以便我可以使用哨兵記錄異常?

[英]How I make a Laravel Job to fail without restarting so I can use sentry to log the exception?

在我的多服務器應用程序中,我使用 laravel 的隊列系統來運行后台作業。 有時在我的邏輯中,我想讓我的工作拋出異常,這樣我就可以使用提供的laravel 庫通過哨兵記錄它。

所以在我的工作中:

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;

use App\Model\Etable\User;
use App\Model\User;

class MyJob implements ShouldQueue
{
    use Dispatchable;
    use InteractsWithQueue;
    use Queueable;

    /**
     * @var int
     */
    private $user_id;


    /**
     * @param int   $user          The user that has opted or deopted for newsletter consent
     */
    public function __construct(int $id)
    {
        $this->user_id = $user_id;
    }


    public function handle(): void
    {  
        /**
         * @var User
         */
        $user=User::useWritePdo()->find($this->user_id);

        if(empty($user)){
            throw new \Exception("No such a user with user id: {$this->user_id}");
        }

        // Rest of logic here
    }
}

一旦拋出異常,我將登錄到哨兵,但它也會繼續重生,因為 laravel 的工作邏輯應該這樣做。

在我的情況下,我認為在用戶不存在的情況下保持重生MyJob是浪費資源,因為如果沒有用戶存在,則無法執行邏輯本身。 另一方面,對於任何其他錯誤,我希望我的工作繼續重試,直到能夠再次成功運行。

那么我怎樣才能讓我的工作不因特定錯誤而重生呢? 如果我可以使用 laravel 提供的默認記錄方法,以便通過哨兵專用通道將錯誤任意記錄到哨兵中,那就更好了。

請注意,除非您明確運行,否則失敗的作業不會重新運行

php artisan queue:failed

您可以在 AppServiceProvider 的 boot 方法中拋出異常並處理它, 刪除作業以避免其進一步重試。 請參閱有關如何執行此操作的文檔

最好和更簡單的方法是一旦代碼無法檢查已經執行了多少次:

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;

use App\Model\Etable\User;
use App\Model\User;

class MyJob implements ShouldQueue
{
    use Dispatchable;
    use InteractsWithQueue;
    use Queueable;

    /**
     * @var int
     */
    private $user_id;


    /**
     * @param int   $user          The user that has opted or deopted for newsletter consent
     */
    public function __construct(int $id)
    {
        $this->user_id = $user_id;
    }


    public function handle(): void
    {  
        /**
         * @var User
         */
        $user=User::useWritePdo()->find($this->user_id);

        if(empty($user)){
            if ($this->attempts() > 1) { 
             return; 
            }
            throw new \Exception("No such a user with user id: {$this->user_id}");
        }

        // Rest of logic here
    }
}

這是通過以下方式實現的:

if ($this->attempts() > 1) { 
 return; 
}

所以你拋出一次異常,異常被記錄到哨兵,然后在第二次將被執行時,它只會退出並且永遠不會重生。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM