【问题标题】:Accessing SQS job data (receipt handle) from a Laravel queued console command从 Laravel 排队控制台命令访问 SQS 作业数据(收据句柄)
【发布时间】:2021-05-31 11:06:13
【问题描述】:

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

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

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

  • 实现Illuminate\Contracts\Queue\ShouldQueue 的自定义类,它还使用Illuminate\Queue\InteractsWithQueueIlluminate\Foundation\Bus\DispatchableIlluminate\Bus\Queueable 特征(我们的类直接排队)
  • 一个自定义命令,扩展Illuminate\Console\Command,通过Illuminate\Foundation\Console\QueuedCommand 运行

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

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

这很好用!但是,我无法从控制台命令中弄清楚如何做类似的事情。

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

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

【问题讨论】:

    标签: php laravel laravel-5 amazon-sqs


    【解决方案1】:

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

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

    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"]}");  
      }
    }
    

    这很好用 - 这意味着我现在也可以从之前的自定义类中删除添加内容。

    【讨论】:

    • 这会引发以下错误ErrorException Trying to access array offset on value of type null
    • 顺便说一句,laravel 在作业排队后也会触发一个事件。您还拥有所需的所有数据,包括。数据库 ID。事件名称:“Illuminate\Queue\Events\JobQueued”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 2016-09-12
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多