Zum Ende der Metadaten springen
Zum Anfang der Metadaten

Sie zeigen eine alte Version dieser Seite an. Zeigen Sie die aktuelle Version an.

Unterschiede anzeigen Seitenhistorie anzeigen

Version 1 Nächste Version anzeigen »

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.

Message/Lib/Message/NewUserWelcomeEmail.php
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.

Message/Lib/Message/NewUserWelcomeEmailHandler.php
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());
        }
    }
}

Warteschlangen



  • Keine Stichwörter