我正在使用Lumen(Laravel)处理带有sqs-plain driver的连接的AWS SQS队列。该驱动程序的工作方式与默认sqs驱动程序相同,但允许我在队列消息正文中使用自定义JSON。
基于该程序包,我创建了一个工作正常的工作处理程序,但在理解如何正确地将消息释放回队列中遇到困难。
在处理程序方法中,我注入了SqsJob并尝试调用release
方法,该方法无法正常工作。
似乎方法SqsJob::release
调用SQS API上的changeMessageVisibility
和父发布方法,该方法只是在作业上设置类变量$this->released = true;
。
因此,消息的“释放”实际上并没有完成,因为消息只是被标记为已释放,并且消息在队列中的可见性已更改。不处理发布将导致消息被“处理”并从队列中删除。
通过反复试验,我发现在处理程序方法中引发异常会将消息发送回队列。
这是作业处理程序的简化版本:
namespace App\Jobs;
use Illuminate\Contracts\Queue\Job as LaravelJob;
use Illuminate\Queue\Jobs\SqsJob;
use Illuminate\Support\Facades\Log;
class HandlerJob extends Job
{
protected $data;
/**
* @param SqsJob $job
* @param array $data
*/
public function handle(SqsJob $job, array $data)
{
if ($this->validData($data)) {
// handle the job
} else {
$this->release(60);
// actually release the job back to queue
throw new \Exception('Invalid Data');
}
}
private function validData($data)
{
//not relevant
}
}
这似乎是队列工作者要处理的基本任务,但我不知道。
使用Laravel / Lumen框架将消息释放回队列的正确方法是什么?