laravel queue-在特定条件下阻止作业重试

s4n0splo  于 2021-06-09  发布在  Redis
关注(0)|答案(0)|浏览(254)

我使用redis::throttle调用api发送sms并保存其响应,以将调用速率限制为每60秒5次,并使用:

Redis::throttle('throttle:sms')->allow(5)->every(60)->then(function(){
    //->API call
    //->Save response
},function($error){//could not obtain lock
    return $this->release(60);//Put back in queue in 60s
});

我没有具体说明 $tries 因为如果无法获得锁,它将被视为一次尝试,如果我处理一个长队列并且多次无法获得锁,那么作业将失败,而不会出现任何“真正的”错误。但我不想永远处理作业,如果有一个真正的错误(如如果响应无法保存),它应该失败而不重试,特别是如果错误后的api调用作为重试将发送另一条短信(我绝对不希望)。
我试过的:

Redis::throttle('throttle')->allow(5)->every(60)->then(function(){
    try{
        $response = MyAPICall();
        $test = 8/0;
        saveResponse($response);
    } catch(\LimiterTimeoutException $e){
        throw $e;
    } catch(Exception $e){
        Log::error($e);
        $this->fail($exception = null);
        //$this->delete();
    }
},function($error){//could not obtain lock
    Log::info($error);
    return $this->release(60);//Put back in queue in 60s
});

如果因为无法获取锁而出现异常,我会将其抛出,让队列处理它,但如果是另一个异常,我会记录错误并失败或删除作业。但这两者都不起作用 delete() 或者 fail() ,则始终重试作业。
如果存在异常而不是 LimiterTimeoutException ?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题