在我的多服务器应用程序中,我使用laravel的排队系统来运行后台作业。有时在我的逻辑中,我想让我的工作抛出一个异常,这样我就可以通过一个哨兵使用提供的laravel library来记录它。
所以在我的工作中:
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的默认日志记录方法,以便通过卫兵专用通道将错误记录到卫兵中,那就更好了。
发布于 2020-04-06 13:46:03
最好也是最简单的方法是,一旦代码不能检查已经执行了多少次:
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;
}
所以一旦抛出异常,异常就会被记录到Sentry中,然后在第二次执行时,它就会退出,再也不会重新出现。
发布于 2020-04-06 10:45:49
请注意,失败的作业将不会重新运行,除非您显式运行
php artisan queue:failed
您可以抛出一个异常,并在AppServiceProvider,deleting the job的引导方法中处理它,以避免其进一步重试。有关如何操作的信息,请参阅documentation。
https://stackoverflow.com/questions/61057560
复制相似问题