从 Laravel 排队的控制台命令访问 SQS 作业数据(接收句柄)

Accessing SQS job data (receipt handle) from a Laravel queued console command

我正在使用 Laravel 5.8.38 和 SQS 队列驱动程序向预先存在的应用程序添加功能。

我正在寻找一种方法来记录处理队列消息的回执句柄,以便我们可以手动从队列中删除严重错误的作业的消息(没有回执 ID,我们必须等待达到可见性超时)。

我对 Laravel 不是很熟悉,我正在尝试解决问题。我们有两种类型的排队作业:

对于自定义 class,浏览 InteractsWithQueueIlluminate/Queue/Jobs/SqsJob 的源代码我发现我可以直接访问收据句柄:

$sqsJob = $this->job->getSqsJob();
\Log::info("Processing SQS job {$sqsJob["MessageId"]} with handle {$sqsJob["ReceiptHandle"]}");

效果很好!但是,我不知道如何从控制台命令做类似的事情。

Laravel 的 QueuedCommand 实现 ShouldQueue 以及 Illuminate\Bus\Queueable,所以我目前的猜测是我需要扩展它,使用 InteractsWithQueue,然后从那里检索并记录收据句柄。但是,如果我这样做,我不知道如何修改 Artisan::queue('app:command', $commandOptions); 来代替我的自定义 QueuedCommand class 排队。

快到了吗?如果是这样,我如何排队我的自定义 QueuedCommand class 而不是 Laravel ?或者,有更好的方法吗?

好的,我刚刚发布了这个问题,然后意识到一位同事提供的建议提供了前进的方向。

所以,这是我的解决方案,以防对其他人有所帮助!

Laravel 在处理任何新队列作业时触发 Illuminate\Queue\Events\JobProcessing 事件。我只需要在 app/Providers/EventServiceProvider.php:

中注册一个监听器
protected $listen = [
  'Illuminate\Queue\Events\JobProcessing' => [
    'App\Listeners\LogSQSJobDetails',
  ],
];

然后提供监听器来处理:

namespace App\Listeners;

use Illuminate\Queue\Events\JobProcessing;

class LogSQSJobDetails
{

  public function __construct()
  {
  }

  public function handle(JobProcessing $event)
  {
    $sqsJob = $this->job->getSqsJob();
    \Log::info("Processing SQS job {$sqsJob["MessageId"]} with handle {$sqsJob["ReceiptHandle"]}");  
  }
}

效果很好 - 这意味着我现在还可以删除之前添加到我的自定义 class 中的内容。