我们有一堆SQS工作,我们使用Laravel' php artisan queue:listen
来监视和处理。
定期,有几分钟' blip和SQS超时。发生这种情况时,queue:listen
会中止并显示如下消息:
[Symfony\Component\Process\Exception\ProcessTimedOutException]
The process "php artisan queue:work
--queue="https://sqs.us-west-2.amazonaws.com/*******/queue"
--delay=0 --memory=128 --sleep=3 --tries=0 -env=production"
exceeded the timeout of 60 seconds.
我已尝试在app/start/global.php
和app/start/artisan.php
处理异常:
App::error(function(Symfony\Component\Process\Exception\ProcessTimedOutException $exception) {
// do nothing
});
不幸的是,异常仍然发生,我的queue:listen
仍然死亡。
如何捕获此异常并将其忽略以进行重试?
答案 0 :(得分:1)
如果有帮助的话,我会使用SupervisorD来运行crons,我会把它从队列中解雇:每秒工作一次,我对SQS没有任何问题。
答案 1 :(得分:0)
你要么重新运行" php artisan队列:工作......"异常处理程序中的队列作业,
或将/ vendor / symfony / process / Symfony / Component / Process / Process :: setTimeout()值增加到更高的值。
或两者兼而有之。
答案 2 :(得分:0)
不是答案,但更像是解决方法:
每当我需要确保进程运行时,即使发生错误,我也在使用npms forever。这个方便的工具一旦崩溃就会重新启动进程。
安装非常简单:
sudo apt-get install nodejs
sudo apt-get install npm
sudo ln -s /usr/bin/nodejs /usr/bin/node
sudo npm -g install forever
使用此命令启动流程:forever start -c php artisan queue:listen
如果您需要停止它:forever stopall
答案 3 :(得分:0)
超时会不时发生。 Symfony Process类有自己的超时设置,导致此特定超时(我相信)。我不确定如果不编辑与工作者有关的核心Laravel代码就可以捕获这个,这不是一个好主意。
我强烈建议使用Laravel文档中显示的主管:
https://laravel.com/docs/5.1/queues#supervisor-configuration
即使失败,这也会自动重启你的监听器。
答案 4 :(得分:0)
问题似乎与队列作业运行时间有关,据我所知,默认运行时间为30秒,你应该增加这个值,可以增加两种方式,
php artisan queue:listen --timeout=1200
或者您可以为特定作业设置$timeout
/**
* The number of seconds the job can run before timing out.
*
* @var int
*/
public $timeout = 1200;
我希望这会有所帮助
答案 5 :(得分:0)
<?php
namespace App;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
abstract class Job implements ShouldQueue, JobStatusInterface
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public $tries = 1; // try only once
public function handle()
{
}
}
使用此抽象类 并派遣扩展类来解决您的问题
<?php
namespace App;
use App\Job;
use Log;
use Exception;
/**
* Class CheckStockJob
*/
class CheckStockJob extends Job
{
public $tries = 100; // how many you need to retry
public function handle()
{
try {
// do something here
}
catch(Exception $e){
Log::error($e);
throw $e; // rethrow to make job fail
}
}
}
代码中的某个地方
$t = new CheckStockJob();
dispatch($t);
答案 6 :(得分:-1)
尝试通过执行以下命令调查命令的可用参数:
php artisan queue:listen --help
。
您可以以秒为单位传递超时值,尝试次数等。