Laravel保留一个排队作业

uelo1irk  于 2023-02-05  发布在  其他
关注(0)|答案(1)|浏览(106)

我们正在使用laravel创建一个应用程序,如example.com。在我们的应用程序上,有一个post API“example.com/api/order-place“。在此api中,我们将一些数据存储在数据库中,并向客户发送成功响应。我们还调用第三方应用程序以获取其他一些数据(third-party.com/api/get-data)。我们使用队列作业来获取此数据,而不会妨碍主要的下订单请求过程。
但是有时候第三方API服务出现故障,这时,我们希望把第三方api调用存储在某个地方(队列),当第三方应用程序服务启动时,我们希望处理所有排队的作业。
我们怎样才能做到这一点?使用laravel队列可以解决这个问题吗?比如当第三方应用程序关闭时,我们保持我们的队列,当第三方应用程序启动时,处理这些作业。
我们可以在失败的作业上使用队列重试来实现这一点。但我们不希望这样。我们只希望在第三方应用程序关闭时保持队列

hiz5n14c

hiz5n14c1#

应该这样工作
1.创建辅助函数以检测第三方API是否启动或关闭
1.创建用于处理第三方API请求的类或辅助函数,如果对第三方API的请求失败,则抛出错误(您可能需要调用**#1**)
1.创建不重试的作业(只能运行一次)并在handle中调用**#2**
1.在不同的queue(即WhatEverJob::dispatch()->onQueue('apirequest');)上推送您的作业。您还应在您的主管工作器(即
php artisan queue:work --queue=default,apirequest
1.创建任务计划程序(cron),它每小时、每分钟或任何时间运行一次。这应该首先运行**#1**(或者先查询failed_jobs,无论什么适合您),并且如果它向下则退出,如果它向上则继续查询failed_jobs表,仅提取列queue值为apirequest的数据。您可以使用payload->displayName执行其他筛选,它应该是您的作业类,你也可以检查payload->maxTries并且做某事如果它超过尝试的次数.然后手工重试每个失败的条目.

样品;

if ( ThirdPartyAPI::is('down') )
    return;

$failedEntries = DB::table('failed_jobs') ->where('queue', 'apirequest')->pluck('uuid');

if ( !$failedEntries )
    return;

$uuids = implode(' ', $failedEntries);

\Artisan::call('queue:retry '. $uuids);

相关问题