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 stattfinden 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
Ein Runner ist eine Komponente, die bestimmte Aufgaben ausführt oder Aktionen koordiniert. Der genaue Kontext und die Aufgaben, die ein Runner ausführt, können jedoch variieren, abhängig von der spezifischen Anwendung oder dem System.
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=YourQueue
Warteschlangen (Queues)
Eine Queue ist eine Datenstruktur, die dazu verwendet wird, Daten oder Elemente in einer bestimmten Reihenfolge zu speichern und zu verwalten. Die Queue funktioniert nach dem Prinzip "First-In-First-Out" (FIFO), was bedeutet, dass das erste Element, das in die Queue eingefügt wurde, auch das erste Element ist, das aus der Queue entfernt wird.
Im obigen Beispiel wird die Queue YourQueue vom Runner überwacht und abgearbeitet.
Messages und Handler
Messages sind Datenelemente oder Informationen, die zwischen verschiedenen Teilen der Anwendung, Systemen oder Komponenten übertragen werden. Messages sind eine wichtige Form der Kommunikation und ermöglichen es, Informationen von einer Quelle zu einem Ziel zu senden oder zu empfangen.
Im Mittelpunkt 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 Message verwendet werden soll. Entsprechend wird diese Message von dem Runner verarbeitet, der diese Queue angibt.
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 'YourQueue'; } 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()); } } }
Nachricht senden
Um eine Aufgabe asynchron zu verarbeiten, wird die Nachricht dispatched (verschickt).
use Brandbox\YourApp\YourNamespace\YourPackage; use \Brandbox\FrameworkMessenger\Messenger\Messenger; $userId = 5; $message = new YourPackage\Lib\Message\NewUserWelcomeEmail($userId); Messenger\BusFactory ::get() ->dispatch($message) ;
Es stehen darüber hinaus weitere Möglichkeiten zur Verfügung, die Art und Weise zu beeinflussen, wie die Nachricht verarbeitet wird. Lesen Sie dazu:
Envelopes & Stamps https://symfony.com/doc/6.2/messenger.html#envelopes-stamps