从 Laravel 排队的控制台命令访问 SQS 作业数据(接收句柄)
Accessing SQS job data (receipt handle) from a Laravel queued console command
我正在使用 Laravel 5.8.38 和 SQS 队列驱动程序向预先存在的应用程序添加功能。
我正在寻找一种方法来记录处理队列消息的回执句柄,以便我们可以手动从队列中删除严重错误的作业的消息(没有回执 ID,我们必须等待达到可见性超时)。
我对 Laravel 不是很熟悉,我正在尝试解决问题。我们有两种类型的排队作业:
- 自定义 class 实现
Illuminate\Contracts\Queue\ShouldQueue
,它也使用 Illuminate\Queue\InteractsWithQueue
、Illuminate\Foundation\Bus\Dispatchable
和 Illuminate\Bus\Queueable
特征(我们的 class 排队直接)
- 自定义命令,扩展
Illuminate\Console\Command
,通过 Illuminate\Foundation\Console\QueuedCommand
运行
对于自定义 class,浏览 InteractsWithQueue
和 Illuminate/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 中的内容。
我正在使用 Laravel 5.8.38 和 SQS 队列驱动程序向预先存在的应用程序添加功能。
我正在寻找一种方法来记录处理队列消息的回执句柄,以便我们可以手动从队列中删除严重错误的作业的消息(没有回执 ID,我们必须等待达到可见性超时)。
我对 Laravel 不是很熟悉,我正在尝试解决问题。我们有两种类型的排队作业:
- 自定义 class 实现
Illuminate\Contracts\Queue\ShouldQueue
,它也使用Illuminate\Queue\InteractsWithQueue
、Illuminate\Foundation\Bus\Dispatchable
和Illuminate\Bus\Queueable
特征(我们的 class 排队直接) - 自定义命令,扩展
Illuminate\Console\Command
,通过Illuminate\Foundation\Console\QueuedCommand
运行
对于自定义 class,浏览 InteractsWithQueue
和 Illuminate/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 中的内容。