我正在尝试延迟分配到AWS SQS队列的Laravel中的工作。 没有延迟的标准作业在该队列上运行正常,但是一旦我延迟某些事情,它就会崩溃。我第一次尝试:
$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()”
堆栈跟踪:
这是完整的堆栈跟踪。我现在正在使用标准队列,一切运行正常!
答案 0 :(得分:1)
您的具体错误是因为Laravel 5.4中删除了TextBlock
方法。该软件包在主分支中有一个更新,以增加5.4+兼容性,但该代码没有标记版本,因此您必须更新您的composer.json文件以指向getSeconds()
。
然而,这里有一个更大的问题。虽然您使用的软件包试图支持dev-master
功能,但这实际上并不正确。
SQS FIFO队列不支持按消息延迟。它们仅支持每队列延迟,这意味着您必须在AWS中定义您的队列并延迟(最多15分钟),如下面的屏幕截图所示。尝试在发送到未定义延迟的队列的消息上设置延迟将不会产生任何影响。
因此,如果您有一些不使用延迟的作业和一些使用延迟的作业,您需要创建至少两个队列:一个没有定义延迟,一个定义了延迟。然后,您必须使用delay
方法将作业发送到延迟定义的队列,而不是使用delay()
方法。
完全披露:我还创建了一个用于处理SQS FIFO队列(shiftonelabs/laravel-sqs-fifo-queue)的Laravel程序包。由于FIFO队列的每个消息延迟限制,我的包在尝试时会引发异常(onQueue()
)。
我的软件包还支持指定其他FIFO特定值的功能,例如消息组ID和重复数据删除ID。