<?php
namespace App\Listeners;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\Events\JobFailed;
use Illuminate\Queue\Events\JobProcessed;
use Illuminate\Queue\Events\JobProcessing;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Support\Facades\Log;
class QueueEventSubscriber
{
/**
* Handle job processing events.
*/
public function handleJobProcessing(JobProcessing $event)
{
$jobName = $event->job->resolveName();
$jobId = $event->job->getJobId();
Log::channel('queue')->info("STARTING: [{$jobId}] {$jobName}");
}
/**
* Handle job processed events.
*/
public function handleJobProcessed(JobProcessed $event)
{
$jobName = $event->job->resolveName();
$jobId = $event->job->getJobId();
Log::channel('queue')->info("SUCCESS: [{$jobId}] {$jobName}");
// You could also calculate duration here for monitoring
// For example, store the start time in a cache/db in handleJobProcessing
// and calculate the difference here.
}
/**
* Handle job failed events.
*/
public function handleJobFailed(JobFailed $event)
{
$jobName = $event->job->resolveName();
$jobId = $event->job->getJobId();
$exceptionMessage = $event->exception->getMessage();
Log::channel('queue')->error("FAILED: [{$jobId}] {$jobName}", [
'exception' => $exceptionMessage,
'payload' => $event->job->getRawBody() // Be careful logging payloads with sensitive data!
]);
// You could send a notification to Slack or an admin here
// \Notification::route('slack', 'YOUR_SLACK_WEBHOOK_URL')
// ->notify(new JobFailedNotification($event));
}
/**
* Register the listeners for the subscriber.
*
* @param \Illuminate\Events\Dispatcher $events
* @return void
*/
public function subscribe($events)
{
$events->listen(
JobProcessing::class,
[QueueEventSubscriber::class, 'handleJobProcessing']
);
$events->listen(
JobProcessed::class,
[QueueEventSubscriber::class, 'handleJobProcessed']
);
$events->listen(
JobFailed::class,
[QueueEventSubscriber::class, 'handleJobFailed']
);
}
}