首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >我如何让Laravel Job在不重新启动的情况下失败,这样我就可以使用sentry来记录异常?

我如何让Laravel Job在不重新启动的情况下失败,这样我就可以使用sentry来记录异常?
EN

Stack Overflow用户
提问于 2020-04-06 18:19:50
回答 2查看 175关注 0票数 0

在我的多服务器应用程序中,我使用laravel的排队系统来运行后台作业。有时在我的逻辑中,我想让我的工作抛出一个异常,这样我就可以通过一个哨兵使用提供的laravel library来记录它。

所以在我的工作中:

代码语言:javascript
代码运行次数:0
运行
复制
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
    }
}

一旦抛出异常,我将被登录到sentry,但它也将继续重新生成,因为laravel的作业逻辑应该是这样做的。

在我的例子中,我认为在用户不存在的情况下重新生成MyJob是浪费资源,没有值可以继续生成,因为在没有用户存在的情况下,逻辑本身无法执行。另一方面,对于任何其他错误,我希望我的作业不断重试,直到能够再次成功运行。

那么,我如何才能让我的工作不在特定的错误中重生呢?如果我可以使用laravel ofers的默认日志记录方法,以便通过卫兵专用通道将错误记录到卫兵中,那就更好了。

EN

回答 2

Stack Overflow用户

发布于 2020-04-06 21:46:03

最好也是最简单的方法是,一旦代码不能检查已经执行了多少次:

代码语言:javascript
代码运行次数:0
运行
复制
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
    }
}

这是通过以下方式实现的:

代码语言:javascript
代码运行次数:0
运行
复制
if ($this->attempts() > 1) { 
 return; 
}

所以一旦抛出异常,异常就会被记录到Sentry中,然后在第二次执行时,它就会退出,再也不会重新出现。

票数 1
EN

Stack Overflow用户

发布于 2020-04-06 18:45:49

请注意,失败的作业将不会重新运行,除非您显式运行

代码语言:javascript
代码运行次数:0
运行
复制
php artisan queue:failed

您可以抛出一个异常,并在AppServiceProvider,deleting the job的引导方法中处理它,以避免其进一步重试。有关如何操作的信息,请参阅documentation

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61057560

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档