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

Php 从Laravel队列控制台命令访问SQS作业数据(接收句柄),php,laravel,laravel-5,amazon-sqs,Php,Laravel,Laravel 5,Amazon Sqs,我正在使用Laravel 5.8.38和SQS队列驱动程序向一个预先存在的应用程序添加功能 我正在寻找一种在处理队列消息时记录它们的接收句柄的方法,这样我们就可以从队列中手动删除出错严重的作业的消息(如果没有接收ID,我们将不得不等待达到可见性超时) 我对拉威尔不是很熟悉,我正在努力把事情弄清楚。我们有两种类型的排队作业: 一个自定义类实现了illumb\Contracts\Queue\ShouldQueue,它还使用illumb\Queue\interacticswithqueue、illu

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

我正在寻找一种在处理队列消息时记录它们的接收句柄的方法,这样我们就可以从队列中手动删除出错严重的作业的消息(如果没有接收ID,我们将不得不等待达到可见性超时)

我对拉威尔不是很熟悉,我正在努力把事情弄清楚。我们有两种类型的排队作业:

  • 一个自定义类实现了
    illumb\Contracts\Queue\ShouldQueue
    ,它还使用
    illumb\Queue\interacticswithqueue
    illumb\Foundation\Bus\Dispatchable
    illumb\Bus\Queueable
    特性(我们的类直接排队)
  • 一个自定义命令,扩展了
    illible\Console\command
    ,通过
    illible\Foundation\Console\QueuedCommand
对于自定义类,浏览
interacticswithqueue
illumb/Queue/Jobs/SqsJob
的源代码,我发现我可以直接访问收据句柄:

$sqsJob = $this->job->getSqsJob();
\Log::info("Processing SQS job {$sqsJob["MessageId"]} with handle {$sqsJob["ReceiptHandle"]}");
这太棒了!但是,我不知道如何从控制台命令执行类似的操作

Laravel的
QueuedCommand
实现了
ShouldQueue
以及
illighted\Bus\Queueable
,因此我目前的猜测是我需要扩展它,使用
InteracticsWithQueue
,并从那里检索和记录收据句柄。但是,如果我这样做,我就不知道如何修改
Artisan::queue('app:command',$commandOptions)
将我的自定义
QueuedCommand
类改为排队


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

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

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

在处理任何新的队列作业时,Laravel会触发
照亮\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"]}");  
  }
}
这非常有效——这意味着我现在也可以从以前的版本中删除对自定义类的添加