Laravel SQS 队列 -> 延迟作业失败
Laravel SQS Queue -> delayed jobs fail
我正在尝试延迟 Laravel 中分派到 AWS SQS 队列的作业。
没有延迟的标准作业 运行 在那个队列上很好,但是一旦我延迟了某些东西,它就会崩溃。我第一次尝试:
$awsgatewayjob = new \App\Jobs\DispatchAwsGatewayJob();
$this->dispatch($awsgatewayjob)->delay(now()->addMinutes(1));
这给出了错误:
Symfony\Component\Debug\Exception\FatalThrowableError (E_ERROR)
在 string
上调用成员函数 delay()
接下来,我尝试使用手册中解释的样式 Laravel:
DispatchAwsGatewayJob::dispatch()->delay(now()->addMinutes(1));
这给出了错误:
Symfony\Component\Debug\Exception\FatalThrowableError (E_ERROR)
调用未定义的方法 Maqe\LaravelSqsFifo\SqsFifoQueue::getSeconds()
我用谷歌搜索了最后一个错误,我很高兴地报告我不是唯一遇到该错误的人:https://github.com/maqe/laravel-sqs-fifo/issues/7
总之,我不明白。我 运行 正在 Laravel 5.5 上,我用 composer update 更新了我所有的包,以确保我没有使用过时的包。
有什么想法吗?
这是作业的(编辑过的)代码:
<?php
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Auth;
use Session;
use Symfony\Component\Process\Process;
use Symfony\Component\Process\Exception\ProcessFailedException;
use Alert;
class DispatchAwsGatewayJob implements ShouldQueue
{
private $method;
private $rest_method;
private $data;
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct($method, $rest_method, $data)
{
$this->method = $method;
$this->rest_method = $rest_method;
$this->data = $data;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
$curl = curl_init();
// some more stuff here to config $curl
$result = curl_exec($curl);
curl_close($curl);
}
}
这是完整的错误日志:
Symfony\Component\Debug\Exception\FatalThrowableError 抛出消息“调用未定义的方法 Maqe\LaravelSqsFifo\SqsFifoQueue::getSeconds()”
堆栈跟踪:
0 Symfony\Component\Debug\Exception\FatalThrowableError 在 /var/www/sparkwebsite/vendor/maqe/laravel-sqs-fifo/src/SqsFifoQueue.php:42
这是完整的堆栈跟踪。我现在使用的是标准队列,一切正常 运行!
您的特定错误是因为 getSeconds()
方法已在 Laravel 5.4 中删除。该软件包在 master 分支中有一个更新以添加 5.4+ 兼容性,但没有带有该代码的标记版本,因此您必须更新您的 composer.json 文件以指向 dev-master
.
但是,这里还有一个更大的问题。虽然您正在使用的包试图支持 delay
功能,但这实际上是不正确的。
SQS FIFO 队列不支持每条消息延迟。它们仅支持按队列延迟,这意味着您必须在 AWS 中定义延迟(最多 15 分钟)的队列,如下面的屏幕截图所示。尝试为发送到未定义延迟的队列的消息设置延迟不会有任何效果。
因此,如果您有一些不使用延迟的作业和一些使用延迟的作业,您将需要创建至少两个队列:一个未定义延迟,一个定义了延迟。然后,您不必使用 delay()
方法,而是必须使用 onQueue()
方法将作业发送到定义有延迟的队列。
完全披露:我还创建了一个 Laravel 包来处理 SQS FIFO 队列 (shiftonelabs/laravel-sqs-fifo-queue). Because of the per-message delay restriction on FIFO queues, my package throws an exception when the attempt is made (BadMethodCallException('FIFO queues do not support per-message delays.')
), though this behavior can be changed via the package config (as described here)。
我的包还支持指定其他 FIFO 特定值的能力,例如消息组 ID 和重复数据删除 ID。
我正在尝试延迟 Laravel 中分派到 AWS SQS 队列的作业。 没有延迟的标准作业 运行 在那个队列上很好,但是一旦我延迟了某些东西,它就会崩溃。我第一次尝试:
$awsgatewayjob = new \App\Jobs\DispatchAwsGatewayJob();
$this->dispatch($awsgatewayjob)->delay(now()->addMinutes(1));
这给出了错误: Symfony\Component\Debug\Exception\FatalThrowableError (E_ERROR) 在 string
上调用成员函数 delay()接下来,我尝试使用手册中解释的样式 Laravel:
DispatchAwsGatewayJob::dispatch()->delay(now()->addMinutes(1));
这给出了错误:
Symfony\Component\Debug\Exception\FatalThrowableError (E_ERROR) 调用未定义的方法 Maqe\LaravelSqsFifo\SqsFifoQueue::getSeconds()
我用谷歌搜索了最后一个错误,我很高兴地报告我不是唯一遇到该错误的人:https://github.com/maqe/laravel-sqs-fifo/issues/7
总之,我不明白。我 运行 正在 Laravel 5.5 上,我用 composer update 更新了我所有的包,以确保我没有使用过时的包。
有什么想法吗?
这是作业的(编辑过的)代码:
<?php
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Auth;
use Session;
use Symfony\Component\Process\Process;
use Symfony\Component\Process\Exception\ProcessFailedException;
use Alert;
class DispatchAwsGatewayJob implements ShouldQueue
{
private $method;
private $rest_method;
private $data;
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct($method, $rest_method, $data)
{
$this->method = $method;
$this->rest_method = $rest_method;
$this->data = $data;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
$curl = curl_init();
// some more stuff here to config $curl
$result = curl_exec($curl);
curl_close($curl);
}
}
这是完整的错误日志:
Symfony\Component\Debug\Exception\FatalThrowableError 抛出消息“调用未定义的方法 Maqe\LaravelSqsFifo\SqsFifoQueue::getSeconds()”
堆栈跟踪:
0 Symfony\Component\Debug\Exception\FatalThrowableError 在 /var/www/sparkwebsite/vendor/maqe/laravel-sqs-fifo/src/SqsFifoQueue.php:42
这是完整的堆栈跟踪。我现在使用的是标准队列,一切正常 运行!
您的特定错误是因为 getSeconds()
方法已在 Laravel 5.4 中删除。该软件包在 master 分支中有一个更新以添加 5.4+ 兼容性,但没有带有该代码的标记版本,因此您必须更新您的 composer.json 文件以指向 dev-master
.
但是,这里还有一个更大的问题。虽然您正在使用的包试图支持 delay
功能,但这实际上是不正确的。
SQS FIFO 队列不支持每条消息延迟。它们仅支持按队列延迟,这意味着您必须在 AWS 中定义延迟(最多 15 分钟)的队列,如下面的屏幕截图所示。尝试为发送到未定义延迟的队列的消息设置延迟不会有任何效果。
因此,如果您有一些不使用延迟的作业和一些使用延迟的作业,您将需要创建至少两个队列:一个未定义延迟,一个定义了延迟。然后,您不必使用 delay()
方法,而是必须使用 onQueue()
方法将作业发送到定义有延迟的队列。
完全披露:我还创建了一个 Laravel 包来处理 SQS FIFO 队列 (shiftonelabs/laravel-sqs-fifo-queue). Because of the per-message delay restriction on FIFO queues, my package throws an exception when the attempt is made (BadMethodCallException('FIFO queues do not support per-message delays.')
), though this behavior can be changed via the package config (as described here)。
我的包还支持指定其他 FIFO 特定值的能力,例如消息组 ID 和重复数据删除 ID。