Der Messenger bietet einen Nachrichtenbus mit der Möglichkeit, Nachrichten zu senden und diese dann sofort in Ihrer Anwendung zu verarbeiten oder sie zur späteren Verarbeitung über Transporte (z. B. Warteschlangen) zu senden.
Quelle: https://symfony.com/doc/current/messenger.html
Allgemeiner Aufbau
In brandbox wird der Messenger genutzt, um Aufgaben abzuarbeiten, die asynchron stattginden sollen. Das schützt davor dass die Anwendung blockiert wird. Die Warteschlange wird von einem Runner in einem separaten Docker-Container ausgeführt. Dabei erhält jede Warteschlange einen eigenen Runner.
Runner
Der Runner kann über nachfolgenden Aufruf gestartet werden. Er wird in Form eines eigenständigen Endpoints ausgeführt und erwartet den Namen der Queue auf die gelauscht werden soll. Der Runner zu testzwecken direkt im Application-Container ausgeführt werden, soll im Produktivbetrieb jedoch in einem separaten Runner-Container laufen.
php plugin/remote/brandbox/framework/src/entrypoint.php -endpoint=messenger -queue=NameOfTheQueue
Messages und Handler
Im Mittelpunkt von Messenger stehen zwei verschiedene Klassen, die Sie erstellen: (1) eine Nachrichtenklasse, die Daten enthält, und (2) eine Handlerklasse, die aufgerufen wird, wenn die Nachricht versendet wird. Die Handler-Klasse liest die Nachrichtenklasse und führt eine oder mehrere Aufgaben aus. Quelle: https://symfony.com/doc/6.2/messenger.html#creating-a-message-handler
Beispiel für eine Message
Die Message muss das MessageInterface implementieren, um verarbeitet zu werden. Das Interface erwartet die Methode getQueue(), mit der der Name der Queue benannt werden kann, die für diese Messege verwendet werden soll. Entsprechend wird diese Message von dem Runner verwarbeitet, der diese Queue angiebt.
namespace Brandbox\YourApp\YourNamespace\YourPackage\Lib\Message { use Brandbox\FrameworkMessenger\Messenger\Messenger; class NewUserWelcomeEmail implements Messenger\Lib\Interface\MessageInterface { public function __construct( private readonly int $userId, ) { } public function getQueue(): string { return 'NameOfTheQueue'; } public function getUserId(): string { return $this->userId; } } }
Beispiel für einen Handler
Der Handler muss den gleichen Namen haben wie die Message und und Suffix Handler erhalten, um verarbeitet zu werden. Der Handler erhält die Message und kann die eigentliche Aufgabe erfüllen. Im nachfolgenden Beispiel wird einfach eine Textnachricht erzeugt. Wichtig ist, das Attribute AsMessageHandler.
namespace Brandbox\YourApp\YourNamespace\YourPackage\Lib\Message { use Symfony\Component\Messenger; #[Messenger\Attribute\AsMessageHandler] class NewUserWelcomeEmailHandler { public function __construct( ) { } public function __invoke(NewUserWelcomeEmail $message) { $message = sprintf('$userId = %s', $message->getUserId()); } } }