将Laravel / Lumen中的AWS SQS消息释放回队列

时间:2019-09-18 10:18:26

标签: php laravel queue amazon-sqs

我正在使用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框架将消息释放回队列的正确方法是什么?

0 个答案:

没有答案