<?php
declare(strict_types=1);
namespace App\HealthCheck;
use App\Message\HealthCheckMessage\IbexaHealthCheckMessage;
use Symfony\Component\Messenger\MessageBusInterface;
use Symfony\Component\Messenger\Stamp\SentStamp;
use SymfonyHealthCheckBundle\Check\CheckInterface;
use SymfonyHealthCheckBundle\Dto\Response;
class MessengerTransportHealthCheck implements CheckInterface
{
public function __construct(private readonly MessageBusInterface $messageBus)
{
}
protected static function buildHealthCheckMessage(): IbexaHealthCheckMessage
{
return new IbexaHealthCheckMessage();
}
public function check(): Response
{
$healthCheckMessage = static::buildHealthCheckMessage();
try {
$healthCheckEnvelope = $this->messageBus->dispatch($healthCheckMessage);
$sentStamp = $healthCheckEnvelope->last(SentStamp::class);
if ($sentStamp?->getSenderAlias() !== $healthCheckMessage->getMessengerTransport()) {
throw new \RuntimeException('Health Check message was not sent correctly!');
}
return new Response('messenger_transport_'.$healthCheckMessage->getMessengerTransport(), $sentStamp?->getSenderAlias() === $healthCheckMessage->getMessengerTransport(), 'up');
} catch (\Throwable $throwable) {
return new Response('messenger_transport_'.$healthCheckMessage->getMessengerTransport(), false, $throwable->getMessage());
}
}
}