我试图推迟在Laravel中调度到AWS SQS队列的工作 . 没有延迟的标准作业在该队列上运行正常,但是一旦我延迟某些事情,它就会崩溃 . 我第一次尝试:
$awsgatewayjob = new \App\Jobs\DispatchAwsGatewayJob();
$this->dispatch($awsgatewayjob)->delay(now()->addMinutes(1));
这给出了错误:Symfony \ Component \ Debug \ Exception \ FatalThrowableError(E_ERROR)调用字符串上的成员函数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()”
堆栈跟踪:
在_var/www/sparkwebsite/vendor/maqe/laravel-sqs-fifo/src/SqsFifoQueue.php:42中_m1_ 0 Symfony \ Component \ Debug \ Exception \ FatalThrowableError
这是完整的堆栈跟踪 . 我现在使用标准队列,一切运行正常!
1 Answer
您的具体错误是因为Laravel 5.4中删除了
getSeconds()
方法 . 该软件包在master分支中有一个更新,以添加5.4兼容性,但该代码没有标记版本,因此您必须更新composer.json文件以指向dev-master
.但是,这里有一个更大的问题 . 虽然您正在使用的软件包试图支持
delay
功能,但这实际上并不正确 .SQS FIFO队列不支持按消息延迟 . 它们仅支持每队列延迟,这意味着您必须在AWS中定义您的队列并延迟(最多15分钟),如下面的屏幕截图所示 . 尝试在发送到未定义延迟的队列的消息上设置延迟将不会产生任何影响 .
因此,如果您有一些不使用延迟的作业和一些使用延迟的作业,则需要创建至少两个队列:一个没有定义延迟,另一个定义了延迟 . 然后,您必须使用
onQueue()
方法将作业发送到延迟定义的队列,而不是使用delay()
方法 .完全披露:我还创建了一个用于处理SQS FIFO队列的Laravel包(shiftonelabs/laravel-sqs-fifo-queue) . 由于FIFO队列的每个消息延迟限制,我的包在尝试时抛出异常(
BadMethodCallException('FIFO queues do not support per-message delays.')
) .我的软件包还支持指定其他FIFO特定值的功能,例如消息组ID和重复数据删除ID .