gpt4 book ai didi

php - Laravel 一旦失败就删除作业

转载 作者:IT王子 更新时间:2023-10-29 06:12:27 26 4
gpt4 key购买 nike

我有一个作业会超时,一旦它失败,它就会像它自己一样调度另一个作业,这样它就可以无限运行并且不会重叠。然而,失败的作业留在队列中并被重试,所以我最终有不止一个作业在运行,这打破了整个目的。

以下是我处理工作失败的方式:

use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

public function handle()
{
//infinite websocket listening loop
}

public function failed(Exception $exception)
{
$this::dispatch()->onQueue('long-queue');
$this->delete();
}

$this->delete() 来自 InteractsWithQueue 特征。我做错了什么?

编辑:我正在使用 horizo​​n 来运行作业,这是在 config/horizo​​n.php

中设置的自定义队列的配置
'supervisor-long' => [
'connection' => 'redis-long',
'queue' => ['long-queue'],
'balance' => 'simple',
'processes' => 3,
'tries' => 1,
'timeout' => 3600,
],

我正在分派(dispatch)的工作是创建一个 Thruway 客户端以连接到 Web 套接字服务器并订阅一个更新 channel ,所以我想永远运行这个工作,但在任何时候只运行这个工作的一个实例。这就是为什么我希望它在没有任何尝试的情况下运行一次,一旦它超时就调度另一个将运行的实例并且循环将继续。我想不出更好的方法来实现这一点,是否有另一种方法可以更好地做到这一点?

最佳答案

失败不执行的原因,只有在作业超过最大尝试次数时才会触发。流程看起来像这样。

$job->dispatch(); // try 1
// times out
// retries on try 2 now
// times out
// retries on try 3 now
// max attempt is hit and MaxAttempt exception is thrown
// failed is called

如果你的作业真的崩溃了,这个逻辑就会改变,这个例子只是在它无限期运行的时候。逻辑在哪里 handled .

在 config/horizo​​n.php 中的队列定义中,您可以定义尝试。

'my-short-queue' => [
'connection' => 'redis',
'queue' => ['my-short-queue'],
'balance' => 'simple',
'processes' => 1,
'tries' => 1,
]

关于php - Laravel 一旦失败就删除作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56889099/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com