---
title: Wie man RabbitMQ als Message Queue für TYPO3 mit DDEV einrichtet
url: "https://b13.com/de/wissen/bessere-skalierbarkeit-mit-entkoppelten-queues-so-richtest-du-rabbitmq-mit-typo3-ein"
description: Wenn integrierte Nachrichtentransporte an ihre Grenzen stoßen, kann RabbitMQ TYPO3 mit einer skalierbaren, robusten Message Queue versorgen.
image: "https://b13.com/fileadmin/_processed_/7/3/csm_QueuesDDEV_Sharing_ca74d06702.png"
date: 2024-03-27
modified: 2026-08-19
lastUpdated: 2026-08-19
---

# Wie man RabbitMQ als Message Queue für TYPO3 mit DDEV einrichtet

[ DDEV ](https://b13.com/de/wissen/ddev) [ TYPO3 ](https://b13.com/de/wissen/typo3)

 Bessere Skalierbarkeit mit entkoppelten Queues: So richtest du RabbitMQ mit TYPO3 ein
=======================================================================================

![](https://b13.com/fileadmin/_processed_/d/d/csm_jochen_7e22d3ed81.jpg)Jochen Roth

  10. April 2024  | Aktualisiert 04. Mai 2026

 [ RSS Feed ](https://b13.com/de/rss.xml)

  ![Eine Reihe stilisierter Figuren in verschiedenen Posen, jede mit einem markanten orangefarbenen Hut, zeigt einen Übergang vom Gehen zum Stillstehen, während sie auf ein Handy schauen, vor einem lila Gitterhintergrund.](https://b13.com/fileadmin/_processed_/d/7/csm_QueuesDDEV_Headerbild_86b0cc20d5.webp)

TYPO3 [v12](https://typo3.org/article/typo3-v12-lts-here-to-save-the-day) unterstützt [Symfony Messenger](https://symfony.com/doc/current/messenger.html), einen flexiblen Message Bus mit der Möglichkeit, Nachrichten innerhalb der Anwendung zur sofortigen Bearbeitung oder über externe Message Transport Services zur asynchronen Bearbeitung zu senden.

In diesem Artikel werden die Schritte zum Hinzufügen eines externen Transports, [RabbitMQ](https://www.rabbitmq.com/), zu einer TYPO3-Instanz erläutert.

   Externe Messaging-Dienste verstehen
-------------------------------------

[Symfony Messenger](https://symfony.com/doc/current/messenger.html) unterstützt eine Reihe von verschiedenen Transporttypen, darunter:

- In-Memory
- Doctrine
- Redis
- AMQP
- und andere.

In der Regel wirst du mit den einfachsten Optionen beginnen wollen. Der In-Memory-Transport ist vielleicht die einfachste Variante, wird aber hauptsächlich zu Testzwecken verwendet.

Der Doctrine-Transport verwendet die vorhandene Datenbank zum Speichern von Nachrichten. Er ist oft die erste Wahl, weil er einfach einzurichten ist und keine externen Abhängigkeiten erfordert.

Doctrine sollte jedoch nicht Ihre endgültige Lösung sein, da die Verwendung einer Datenbank als Nachrichtenwarteschlange nicht gut skalierbar ist. Irgendwann wirst du ein externes Message-Queue-System wie RabbitMQ oder Redis verwenden wollen — Vermittler, die deinen Anwendungen, Microservices und Softwarekomponenten eine gemeinsame Plattform zum Austausch von Nachrichten bieten.

In diesem Artikel konzentrieren wir uns auf [RabbitMQ](https://www.rabbitmq.com/), einen sehr beliebten und ausgereiften Open-Source Messaging Broker.

Abgesehen von dem in TYPO3 integrierten Doctrine-Transport hat ein System wie RabbitMQ mehrere Vorteile:

- **Es ist gut skalierbar**. RabbitMQ kann eine große Anzahl von Nachrichtenanbietern und -verbrauchern bedienen. Anwendungen können miteinander verbunden werden, als Komponenten einer größeren Anwendung, oder mit Benutzergeräten und Daten. Die Arbeitslast kann auf mehrere Prozesse verteilt werden.
- **Unterstützung für verteilte Systeme.** RabbitMQ kann Nachrichten-Broker auf mehreren Knoten ausführen, um die Arbeitslast auf ein Netzwerk von Diensten zu verteilen und Nachrichten zwischen Produzenten und Konsumenten weiterzuleiten.
- **Fehlertoleranz durch Design.** Nachrichten werden in einer Warteschlange gespeichert, bis sie verbraucht werden. Die Warteschlange kann Lastspitzen auffangen und Nachrichten speichern, falls ein oder mehrere Verbraucher vorübergehend nicht verfügbar sind.

Diese Vorteile machen es lohnenswert, die Zeit zu investieren, um einen externen Nachrichtentransport für TYPO3 einzurichten. Wenn du RabbitMQ ausprobieren willst, lies weiter, um zu sehen, wie man ein DDEV-basiertes Nachrichtenwarteschlangen-Projekt erstellt.

   Einrichten von RabbitMQ in TYPO3 mit DDEV
-------------------------------------------

Beginnen wir mit einem leeren Blatt Papier. Für diese Übung verwenden wir [Docker](https://www.docker.com/) und [DDEV](https://ddev.com/) sowie das [GitLab TYPO3-Site-Paket](https://gitlab.com/gitlab-org/project-templates/typo3-distribution), du benötigst also ein GitLab-Konto. Das GitLab TYPO3-Site-Paket ist eine Projektvorlage für die Erstellung eines [Site-Pakets](https://docs.typo3.org/m/typo3/tutorial-sitepackage/12.4/en-us/Index.html#start) auf der Grundlage einer sauberen TYPO3-Installation.

### Docker und DDEV installieren

DDEV verwaltet containerisierte PHP-Entwicklungsumgebungen und ermöglicht es Ihnen, ein Projekt in Sekundenschnelle einzurichten.

Folge den [DDEV-Installationsanweisungen](https://ddev.com/get-started/), um sowohl Docker als auch DDEV zu installieren.

Für die Einrichtung siehe auch die [Dokumentation zu DDEV.](https://ddev.readthedocs.io/en/stable/users/extend/customizing-images/#adding-extra-debian-packages-with-web[…]a_packages-and-dbimage_extra_packages)

### Einrichten einer TYPO3-Site

Mit der TYPO3-Distributionsvorlage in GitLab kannst du auf einfache Weise eine TYPO3-Site einschließlich eines leeren Site-Pakets einrichten.

1\. Anmelden bei GitLab

2\. Klicke in der oberen linken Ecke auf das Pluszeichen + und wählen Sie **New project/Repository**.

  ![Menüoptionen zum Erstellen neuer Elemente in einer Softwareoberfläche, einschließlich „Neues Projekt/Repository“, „Neue Gruppe“ und „Neuer Snippet“, die neben einem Logo in der oberen linken Ecke angezeigt werden.](https://b13.com/fileadmin/_processed_/2/6/csm_Setup_RabbitMQ_2fcce1895e.webp)

  3\. Wähle „**Create from template**„.

4\. Blätter in der Liste der Vorlagen nach unten zu „TYPO3 Distribution“ und klicke auf „**Use template**„.

  ![TYPO3-Verteilungsvorlage zur Initiierung eines neuen TYPO3-Projekts, mit Optionen zur Vorschau oder Nutzung der Vorlage.](https://b13.com/fileadmin/_processed_/7/5/csm_Setup_RabbitMQ_1_b2fc2476a6.webp)

  5\. Gib im Vorlagenformular den Namen „TYPO3 and RabbitMQ“ ein. Wähle eine Gruppe oder einen Namespace und klicke dann auf „**Create project**„.

  ![Formulare für die Erstellung eines Projekts mit dem Titel „TYPO3 und RabbitMQ“, einschließlich Eingabefeldern für den Projektnamen, die URL, den Slug, die Beschreibung und Optionen für die Sichtbarkeitsstufe.](https://b13.com/fileadmin/_processed_/7/4/csm_Setup_RabbitMQ_2_cd9017a107.webp)

  6\. Wenn das Projekt erstellt ist, öffne eine lokale Shell auf Ihrem System und klone das Repository in einen lokalen Ordner.

7\. Wechsel in das Verzeichnis des Projekts und initialisiere TYPO3.

  ```
1<br></br>2<br></br>3<br></br>
```

```
<span class="hljs-attr">cd</span> <span class="hljs-string">typo3-and-rabbitmq</span><span class="hljs-attr"><br></br></span><br></br><span class="hljs-attr">ddev</span> <span class="hljs-string">typo3-init</span><br></br>
```

  Mit diesem Befehl wird das anfängliche Projekt erstellt und Docker-Container mit einem Webserver und einer Datenbank darin gestartet.

Nach Beendigung des Befehls werden die Anmeldedaten in das Terminal ausgegeben und die Anmeldeseite im Browser geöffnet.

8\. Melde dich an, um zu testen, ob TYPO3 einwandfrei läuft. Wenn sich die Anmeldeseite nicht automatisch öffnet, öffne sie unter dem Pfad /TYPO3. Basierend auf den GitLab-Details aus Schritt 5 lautet die Login-URL „https://typo3-and-rabbitmq.ddev.site/typo3“.

  ### RabbitMQ installieren

Jetzt kannst du RabbitMQ über DDEV installieren.

1\. Führe in der Shell folgenden Befehl aus:

  ```
1<br></br>
```

```
ddev <span class="hljs-builtin-name">get</span> b13/ddev-rabbitmq<br></br>
```

  2\. Füge diese Zeilen zu deinem **.ddev/config.yaml** hinzu:

  ```
1<br></br>
```

```
webimage_extra_packages: [<span class="hljs-string">"php${DDEV_PHP_VERSION}-amqp"</span>]<br></br>
```

  AMQP ist das Nachrichtenprotokoll, das RabbitMQ verwendet. Das Paket webimage\_extra\_packages stellt sicher, dass das Paket amqp installiert ist.

3\. Starte nun deine Container neu, um die Änderung zu übernehmen:

  ```
1<br></br>
```

```
<span class="hljs-attribute">ddev restart</span><br></br>
```

  Dies kann ein paar Sekunden dauern.

4\. Führe ddev describe aus, um zu sehen, ob RabbitMQ installiert ist. Der Befehl zeigt die URL des RabbitMQ-Dienstes an.

AMQP-Unterstützung für den Symfony Messenger installieren

Da RabbitMQ das AMPQ-Protokoll verwendet, werden wir nun AMQP für den Symfony Messenger einrichten.

1\. Installiere das Paket symfony/messenger:

  ```
1<br></br>
```

```
ddev composer req symfony/amqp-messenger:^<span class="hljs-number">6.4</span><br></br>
```

  2\. TYPO3 muss wissen, wie man mit dem RabbitMQ-Dienst kommuniziert. Um dies zu erreichen, bearbeite die Datei in **packages/site-distribution/Configuration/Services.yaml** wie folgt (achte darauf, dass du die Einrückung beibehältst):

  ```
1<br></br>2<br></br>3<br></br>4<br></br>5<br></br>6<br></br>7<br></br>8<br></br>9<br></br>10<br></br>11<br></br>12<br></br>13<br></br>14<br></br>15<br></br>16<br></br>17<br></br>18<br></br>19<br></br>20<br></br>21<br></br>22<br></br>23<br></br>24<br></br>25<br></br>26<br></br>27<br></br>28<br></br>29<br></br>30<br></br>31<br></br>32<br></br>33<br></br>34<br></br>35<br></br>36<br></br>37<br></br>
```

```
services:<br></br>  _defaults:<br></br>    autowire: true<br></br>    autoconfigure: true<br></br>    public: true<br></br><br></br>  Site<span class="hljs-tag">\<span class="hljs-name">Distribution</span></span><span class="hljs-tag">\<span class="hljs-name">:</span></span><br></br>    resource: "../Classes/*"<br></br>    exclude: "../Classes/Domain/Model/*"<br></br><br></br>  Site<span class="hljs-tag">\<span class="hljs-name">Distribution</span></span><span class="hljs-tag">\<span class="hljs-name">Queue</span></span><span class="hljs-tag">\<span class="hljs-name">Handler</span></span><span class="hljs-tag">\<span class="hljs-name">MyHandler</span></span>:<br></br>    tags:<br></br>      - name: "messenger.message_handler"<br></br><br></br>  Site<span class="hljs-tag">\<span class="hljs-name">Distribution</span></span><span class="hljs-tag">\<span class="hljs-name">Queue</span></span><span class="hljs-tag">\<span class="hljs-name">Message</span></span><span class="hljs-tag">\<span class="hljs-name">MyMessage</span></span>:<br></br>    arguments:<br></br>      <span class="hljs-formula">$content: 'Default content'<br></br><br></br>  # RabbitMQ<br></br>  Symfony<span class="hljs-tag">\<span class="hljs-name">Component</span></span><span class="hljs-tag">\<span class="hljs-name">Messenger</span></span><span class="hljs-tag">\<span class="hljs-name">Bridge</span></span><span class="hljs-tag">\<span class="hljs-name">Amqp</span></span><span class="hljs-tag">\<span class="hljs-name">Transport</span></span><span class="hljs-tag">\<span class="hljs-name">AmqpTransportFactory</span></span>:<br></br>    public: true<br></br><br></br>  Symfony<span class="hljs-tag">\<span class="hljs-name">Component</span></span><span class="hljs-tag">\<span class="hljs-name">Messenger</span></span><span class="hljs-tag">\<span class="hljs-name">Bridge</span></span><span class="hljs-tag">\<span class="hljs-name">Amqp</span></span><span class="hljs-tag">\<span class="hljs-name">Transport</span></span><span class="hljs-tag">\<span class="hljs-name">AmqpTransport</span></span>:<br></br>    factory:<br></br>      [<br></br>        '@Symfony<span class="hljs-tag">\<span class="hljs-name">Component</span></span><span class="hljs-tag">\<span class="hljs-name">Messenger</span></span><span class="hljs-tag">\<span class="hljs-name">Bridge</span></span><span class="hljs-tag">\<span class="hljs-name">Amqp</span></span><span class="hljs-tag">\<span class="hljs-name">Transport</span></span><span class="hljs-tag">\<span class="hljs-name">AmqpTransportFactory</span></span>',<br></br>        "createTransport",<br></br>      ]<br></br>    arguments:<br></br>      $</span>dsn: "amqp://rabbitmq:rabbitmq@rabbitmq:5672/<span class="hljs-comment">%2f/queue"</span><br></br>      <span class="hljs-formula">$options: {}<br></br>    tags:<br></br>      - name: "messenger.sender"<br></br>        identifier: "amqp"<br></br>      - name: "messenger.receiver"<br></br>        identifier: "amqp"<br></br></span><br></br>
```

  Beachte das Argument $dsn, das die Verbindungszeichenfolge enthält. Beim Einsatz in der Produktion musst du die Parameter entsprechend anpassen. Dies ist die kanonische Form des AMQP-DSN:

  ```
1<br></br>
```

```
amqp://<span class="hljs-tag"><<span class="hljs-name">username</span>></span>:<span class="hljs-tag"><<span class="hljs-name">password</span>></span>@rabbitmq:5672/<span class="hljs-tag"><<span class="hljs-name">virtual</span> <span class="hljs-attr">host</span>></span>/<span class="hljs-tag"><<span class="hljs-name">queue</span> <span class="hljs-attr">name</span>></span><br></br>
```

  ### Erstellen einer Nachrichtenklasse

Um eine Nachricht zu versenden und zu verarbeiten, benötigt man eine Nachrichtenklasse. Eine sehr einfache Version einer Nachrichtenklasse ist die folgende, die du in Classes/Queue/Message/MyMessage.php erstellen kannst:

  ```
1<br></br>2<br></br>3<br></br>4<br></br>5<br></br>6<br></br>7<br></br>8<br></br>9<br></br>10<br></br>11<br></br>12<br></br>13<br></br>
```

```
<span class="php"><span class="hljs-meta"><?php</span><br></br><br></br><span class="hljs-keyword">declare</span>(strict_types=<span class="hljs-number">1</span>);<br></br><br></br><span class="hljs-keyword">namespace</span> <span class="hljs-title">Site</span>\<span class="hljs-title">Distribution</span>\<span class="hljs-title">Queue</span>\<span class="hljs-title">Message</span>;<br></br><br></br><span class="hljs-keyword">final</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MyMessage</span><br></br></span>{<br></br>	<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">__construct</span><span class="hljs-params">(<br></br>    	public readonly string $content<br></br>	)</span> </span>{<br></br>	}<br></br>}</span><br></br>
```

  3\. Die Klasse MyMessage muss für den asynchronen Transport über AMQP konfiguriert werden. Bearbeite die Datei **packages/site-distribution/ext\_localconf.php** entsprechend:

  ```
1<br></br>2<br></br>3<br></br>4<br></br>5<br></br>6<br></br>7<br></br>8<br></br>9<br></br>10<br></br>11<br></br>12<br></br>13<br></br>14<br></br>15<br></br>16<br></br>17<br></br>18<br></br>19<br></br>20<br></br>21<br></br>22<br></br>23<br></br>24<br></br>25<br></br>26<br></br>
```

```
<span class="php"><span class="hljs-meta"><?php</span><br></br><br></br><span class="hljs-keyword">declare</span>(strict_types=<span class="hljs-number">1</span>);<br></br><br></br><span class="hljs-keyword">use</span> <span class="hljs-title">Site</span>\<span class="hljs-title">Distribution</span>\<span class="hljs-title">Queue</span>\<span class="hljs-title">Message</span>\<span class="hljs-title">MyMessage</span>;<br></br><span class="hljs-keyword">use</span> <span class="hljs-title">TYPO3</span>\<span class="hljs-title">CMS</span>\<span class="hljs-title">Core</span>\<span class="hljs-title">Messaging</span>\<span class="hljs-title">WebhookMessageInterface</span>;<br></br><br></br>defined(<span class="hljs-string">'TYPO3'</span>) <span class="hljs-keyword">or</span> <span class="hljs-keyword">die</span>();<br></br><br></br><span class="hljs-comment">// Include vite generated manifest file (global)</span><br></br>$GLOBALS[<span class="hljs-string">'TYPO3_CONF_VARS'</span>][<span class="hljs-string">'EXTENSIONS'</span>][<span class="hljs-string">'vite_asset_collector'</span>][<span class="hljs-string">'defaultManifest'</span>] = <span class="hljs-string">'EXT:site-distribution/Resources/Public/Vite/.vite/manifest.json'</span>;<br></br><br></br><span class="hljs-comment">// Include custom RTE config</span><br></br>$GLOBALS[<span class="hljs-string">'TYPO3_CONF_VARS'</span>][<span class="hljs-string">'RTE'</span>][<span class="hljs-string">'Presets'</span>][<span class="hljs-string">'default'</span>] = <span class="hljs-string">'EXT:site-distribution/Configuration/RTE/RteDefaultPreset.yaml'</span>;<br></br><br></br><span class="hljs-comment">// Unset the default, so that it no longer applies</span><br></br><span class="hljs-keyword">unset</span>($GLOBALS[<span class="hljs-string">'TYPO3_CONF_VARS'</span>][<span class="hljs-string">'SYS'</span>][<span class="hljs-string">'messenger'</span>][<span class="hljs-string">'routing'</span>][<span class="hljs-string">'*'</span>]);<br></br><br></br><span class="hljs-comment">// Set Webhook-Messages and MyCustomMessage to asynchronous transport via amqp</span><br></br><span class="hljs-keyword">foreach</span> ([WebhookMessageInterface::class, MyMessage::class] <span class="hljs-keyword">as</span> $className) {<br></br>    $GLOBALS[<span class="hljs-string">'TYPO3_CONF_VARS'</span>][<span class="hljs-string">'SYS'</span>][<span class="hljs-string">'messenger'</span>][<span class="hljs-string">'routing'</span>][$className] = <span class="hljs-string">'amqp'</span>;<br></br>}<br></br><br></br>$GLOBALS[<span class="hljs-string">'TYPO3_CONF_VARS'</span>][<span class="hljs-string">'SYS'</span>][<span class="hljs-string">'messenger'</span>][<span class="hljs-string">'config'</span>][<span class="hljs-string">'amqp'</span>] = [<br></br>    <span class="hljs-string">'dsn'</span> => <span class="hljs-string">'amqp://rabbitmq:rabbitmq@rabbitmq:5672/%2f/messages'</span>,<br></br>];</span><br></br>
```

  ### Einrichten einer Message-Handler-Klasse

Ein Message-Handler empfängt und verarbeitet Nachrichten vom RabbitMQ-Broker. Er wendet sich nicht aktiv an den Broker, sondern verlässt sich auf einen Consumer-Prozess, der jede Nachricht liest und sie an den Message-Handler weitergibt.

Hier ist eine einfache Version eines Message-Handlers, die Sie in **packages/site-distribution/Classes/Queue/Handler/MyHandler.php** erstellen können:

  ```
1<br></br>2<br></br>3<br></br>4<br></br>5<br></br>6<br></br>7<br></br>8<br></br>9<br></br>10<br></br>11<br></br>12<br></br>13<br></br>14<br></br>15<br></br>16<br></br>17<br></br>18<br></br>19<br></br>20<br></br>21<br></br>22<br></br>23<br></br>24<br></br>25<br></br>26<br></br>
```

```
<span class="php"><span class="hljs-meta"><?php</span><br></br><br></br><span class="hljs-keyword">declare</span>(strict_types=<span class="hljs-number">1</span>);<br></br><br></br><span class="hljs-keyword">use</span> <span class="hljs-title">Site</span>\<span class="hljs-title">Distribution</span>\<span class="hljs-title">Queue</span>\<span class="hljs-title">Message</span>\<span class="hljs-title">MyMessage</span>;<br></br><span class="hljs-keyword">use</span> <span class="hljs-title">TYPO3</span>\<span class="hljs-title">CMS</span>\<span class="hljs-title">Core</span>\<span class="hljs-title">Messaging</span>\<span class="hljs-title">WebhookMessageInterface</span>;<br></br><br></br>defined(<span class="hljs-string">'TYPO3'</span>) <span class="hljs-keyword">or</span> <span class="hljs-keyword">die</span>();<br></br><br></br><span class="hljs-comment">// Include vite generated manifest file (global)</span><br></br>$GLOBALS[<span class="hljs-string">'TYPO3_CONF_VARS'</span>][<span class="hljs-string">'EXTENSIONS'</span>][<span class="hljs-string">'vite_asset_collector'</span>][<span class="hljs-string">'defaultManifest'</span>] = <span class="hljs-string">'EXT:site-distribution/Resources/Public/Vite/.vite/manifest.json'</span>;<br></br><br></br><span class="hljs-comment">// Include custom RTE config</span><br></br>$GLOBALS[<span class="hljs-string">'TYPO3_CONF_VARS'</span>][<span class="hljs-string">'RTE'</span>][<span class="hljs-string">'Presets'</span>][<span class="hljs-string">'default'</span>] = <span class="hljs-string">'EXT:site-distribution/Configuration/RTE/RteDefaultPreset.yaml'</span>;<br></br><br></br><span class="hljs-comment">// Unset the default, so that it no longer applies</span><br></br><span class="hljs-keyword">unset</span>($GLOBALS[<span class="hljs-string">'TYPO3_CONF_VARS'</span>][<span class="hljs-string">'SYS'</span>][<span class="hljs-string">'messenger'</span>][<span class="hljs-string">'routing'</span>][<span class="hljs-string">'*'</span>]);<br></br><br></br><span class="hljs-comment">// Set Webhook-Messages and MyMessage to asynchronous transport via amqp</span><br></br><span class="hljs-keyword">foreach</span> ([WebhookMessageInterface::class, MyMessage::class] <span class="hljs-keyword">as</span> $className) {<br></br>    $GLOBALS[<span class="hljs-string">'TYPO3_CONF_VARS'</span>][<span class="hljs-string">'SYS'</span>][<span class="hljs-string">'messenger'</span>][<span class="hljs-string">'routing'</span>][$className] = <span class="hljs-string">'amqp'</span>;<br></br>}<br></br><br></br>$GLOBALS[<span class="hljs-string">'TYPO3_CONF_VARS'</span>][<span class="hljs-string">'SYS'</span>][<span class="hljs-string">'messenger'</span>][<span class="hljs-string">'config'</span>][<span class="hljs-string">'amqp'</span>] = [<br></br>    <span class="hljs-string">'dsn'</span> => <span class="hljs-string">'amqp://rabbitmq:rabbitmq@rabbitmq:5672/%2f/messages'</span>,<br></br>];</span><br></br>
```

  Teste die Message Queue

Nun ist es an der Zeit, die Queue zu testen. Eine einfache Möglichkeit, Nachrichten in die Warteschlange einzuspeisen, besteht darin, eine Middleware einzurichten, die bei jedem Laden einer Seite ausgelöst wird.

1\. Füge eine Klasse „RunTheRabbit“, die das MiddlewareInterface implementiert, zu **packages/site-distribution/Classes/Middleware/RunTheRabbit.php** hinzu:

  ```
1<br></br>2<br></br>3<br></br>4<br></br>5<br></br>6<br></br>7<br></br>8<br></br>9<br></br>10<br></br>11<br></br>12<br></br>13<br></br>14<br></br>15<br></br>16<br></br>17<br></br>18<br></br>19<br></br>20<br></br>21<br></br>22<br></br>23<br></br>24<br></br>25<br></br>26<br></br>27<br></br>28<br></br>29<br></br>30<br></br>
```

```
<span class="php"><span class="hljs-meta"><?php</span><br></br><br></br><span class="hljs-keyword">declare</span>(strict_types=<span class="hljs-number">1</span>);<br></br><br></br><span class="hljs-keyword">namespace</span> <span class="hljs-title">Site</span>\<span class="hljs-title">Distribution</span>\<span class="hljs-title">Middleware</span>;<br></br><br></br><span class="hljs-keyword">use</span> <span class="hljs-title">Psr</span>\<span class="hljs-title">Http</span>\<span class="hljs-title">Message</span>\<span class="hljs-title">ResponseInterface</span>;<br></br><span class="hljs-keyword">use</span> <span class="hljs-title">Psr</span>\<span class="hljs-title">Http</span>\<span class="hljs-title">Message</span>\<span class="hljs-title">ServerRequestInterface</span>;<br></br><span class="hljs-keyword">use</span> <span class="hljs-title">Psr</span>\<span class="hljs-title">Http</span>\<span class="hljs-title">Server</span>\<span class="hljs-title">MiddlewareInterface</span>;<br></br><span class="hljs-keyword">use</span> <span class="hljs-title">Psr</span>\<span class="hljs-title">Http</span>\<span class="hljs-title">Server</span>\<span class="hljs-title">RequestHandlerInterface</span>;<br></br><span class="hljs-keyword">use</span> <span class="hljs-title">Site</span>\<span class="hljs-title">Distribution</span>\<span class="hljs-title">Queue</span>\<span class="hljs-title">Message</span>\<span class="hljs-title">MyMessage</span>;<br></br><span class="hljs-keyword">use</span> <span class="hljs-title">Symfony</span>\<span class="hljs-title">Component</span>\<span class="hljs-title">Messenger</span>\<span class="hljs-title">MessageBusInterface</span>;<br></br><br></br><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">RunTheRabbit</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">MiddlewareInterface</span><br></br></span>{<br></br>    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">__construct</span><span class="hljs-params">(private readonly MessageBusInterface $bus)</span><br></br>    </span>{<br></br>    }<br></br><br></br>    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">process</span><span class="hljs-params">(<br></br>        ServerRequestInterface $request,<br></br>        RequestHandlerInterface $handler<br></br>    )</span>: <span class="hljs-title">ResponseInterface</span> </span>{<br></br>        $content = <span class="hljs-string">'Some important content'</span>;<br></br>        <span class="hljs-keyword">$this</span>->bus->dispatch(<span class="hljs-keyword">new</span> MyMessage($content));<br></br><br></br>        <span class="hljs-keyword">return</span> $handler->handle($request);<br></br>    }<br></br>}<br></br></span><br></br>
```

  2\. Um die Middleware zu registrieren, erstelle die Datei **packages/site-distribution/Configuration/RequestMiddlewares.php** und füge den folgenden Code hinzu:

  ```
1<br></br>2<br></br>3<br></br>4<br></br>5<br></br>6<br></br>7<br></br>8<br></br>9<br></br>10<br></br>11<br></br>12<br></br>13<br></br>14<br></br>15<br></br>
```

```
<span class="php"><span class="hljs-meta"><?php</span><br></br><span class="hljs-keyword">return</span> [<br></br>    <span class="hljs-string">'frontend'</span> => [<br></br>        <span class="hljs-string">'site-rabbit'</span> => [<br></br>            <span class="hljs-string">'target'</span> => \Site\Distribution\Middleware\RunTheRabbit::class,<br></br>            <span class="hljs-string">'after'</span> => [<br></br>                <span class="hljs-string">'TYPO3/cms-frontend/authentication'</span>,<br></br>            ],<br></br>            <span class="hljs-string">'before'</span> => [<br></br>                <span class="hljs-string">'TYPO3/cms-frontend/base-redirect-resolver'</span>,<br></br>            ],<br></br>        ],<br></br>    ],<br></br>];<br></br></span><br></br>
```

  3\. Es ist Zeit zum Testen! Starte TYPO3 neu, um alle Änderungen zu übernehmen:

  ```
1<br></br>
```

```
<span class="hljs-attribute">ddev restart</span><br></br>
```

  4\. Überprüfe, ob alle Dienste verfügbar sind:

  ```
1<br></br>
```

```
<span class="hljs-attribute">ddev describe</span><br></br>
```

  Du solltest ein „OK“ für die Web-, db- und rabbitmq-Dienste sehen.

5\. Du musst einen Consumer starten, um die Nachrichten zu lesen, die RunTheRabbit an die Warteschlange sendet. Um das Testen zu erleichtern, kannst du diesen Einzeiler verwenden:

  ```
1<br></br>
```

```
ddev <span class="hljs-type">TYPO3</span> messenger:<span class="hljs-keyword">consume</span> -vv amqp<br></br>
```

  Das Flag -vv veranlasst den Verbraucher, seine Aktionen auf dem Terminal zu protokollieren.

6\. Öffne nun das TYPO3-Frontend. Jedes Mal, wenn du eine Seite im Frontend öffnest oder neu lädst, wirst du diese Meldung im Terminal sehen:

  ```
1<br></br>
```

```
[info] Site<span class="hljs-tag">\<span class="hljs-name">Distribution</span></span><span class="hljs-tag">\<span class="hljs-name">Queue</span></span><span class="hljs-tag">\<span class="hljs-name">Message</span></span><span class="hljs-tag">\<span class="hljs-name">MyMessage</span></span> was handled successfully (acknowledging to transport).<br></br>
```

  Herzlichen Glückwunsch! Du hast erfolgreich RabbitMQ Messaging mit TYPO3 eingerichtet.

Schlussfolgerung: Message Queues und TYPO3 sind ein gutes Team
--------------------------------------------------------------

Das Einrichten von Nachrichten-Warteschlangen mit TYPO3 ist in v12 viel einfacher geworden. Mit wenigen Schritten ist es möglich, RabbitMQ mit TYPO3 einzurichten und zu integrieren. Jetzt gibt es keinen Grund mehr, sich über wachsende Besucherzahlen auf deiner Website Sorgen zu machen. Wenn bestimmte beliebte Dienste wie die PDF-Erzeugung oder das Zippen von Dateien für den Download zu viel CPU-Leistung verbrauchen, kannst du diese Aufgaben dank der neuen Message Queue-Integration an asynchrone Worker auf verschiedenen Nodes auslagern.

  Wenn du Hilfe oder Unterstützung bei der Implementierung von Nachrichtenwarteschlangen brauchst, kontaktiere uns!

 [ Meld dich bei uns. ](https://b13.com/de/kontakt)

  ###  Geschrieben von:

 ![Lächelnder Mann mit dunklen Haaren, der einen blauen Hoodie trägt, steht in einer gut beleuchteten Umgebung mit verschwommenen Hintergrundelementen.](https://b13.com/fileadmin/_processed_/d/d/csm_jochen_88d69c78e9.webp)

Jochen ist ein TYPO3-Entwickler mit Liebe zur Community. Er erstellt schöne Websites und liebt sauber geschriebenen Code. Sein unverzichtbares Werkzeug: TYPO3.

 Jochen Roth  Development

 [ mehr von Jochen Roth ](https://b13.com/de/team/jochen-roth)

  Ähnliche Artikel
------------------

- ![Cartoon-Trophäenfigur umgeben von Händen, die Daumen hoch und ein Herzzeichen geben, vor einem Hintergrund mit Zahnradmuster.](https://b13.com/fileadmin/_processed_/f/7/csm_T3ppy_Design_Kit_Headerbild_b51eb9dc31.webp)

    ###  T3ppy gibt TYPO3 ein freundliches Gesicht

     06. August 2026 | Florian “Flix” Keitgen

     TYPO3 ist leistungsstark — muss sich aber nicht unpersönlich anfühlen. Das ist T3ppy, unser freundlicher Begleiter fürs Backend.

     [ weiterlesen: T3ppy gibt TYPO3 ein freundliches Gesicht ](https://b13.com/de/wissen/t3ppy-design-kit)
- ![Hammer mit der Aufschrift 'KI' auf einem schaltkreis-musternden Hintergrund mit gelben Sternen, der Regulierung oder Gesetzgebung im Zusammenhang mit künstlicher Intelligenz in der EU symbolisiert.](https://b13.com/fileadmin/_processed_/1/0/csm_EUAIAct_Headerbild_510724b3de.webp)

    ###  KI-Inhalte in TYPO3: Transparenz braucht Verantwortung

     02. August 2026 | Benni Mack

     Der EU AI Act rückt die Herkunft KI-generierter Inhalte in den Fokus. AI Label kennzeichnet KI-generierte und KI-bearbeitete Inhalte in TYPO3 und dokumentiert, wer den…

     [ weiterlesen: KI-Inhalte in TYPO3: Transparenz braucht Verantwortung ](https://b13.com/de/wissen/ai-content-in-typo3-labelling-needs-accountability)
- ![Eine Cartoonfigur, die einem Schild ähnelt, gibt ein Daumen hoch vor einer Computeroberfläche mit verschiedenen Menüoptionen.](https://b13.com/fileadmin/_processed_/e/6/csm_Header_cda1f80173.webp)

    ###  Gestatten, T3ppy! Ein neues Zeitalter für die Redaktionsarbeit in TYPO3

     01. April 2026 | Florian “Flix” Keitgen

     Entdecke T3ppy und AiM — Deine KI-Assistenz im TYPO3 Backend für bessere Inhalte, klare Strukturen und volle Kontrolle über Redaktions-Prozesse.

     [ weiterlesen: Gestatten, T3ppy! Ein neues Zeitalter für die Redaktionsarbeit in TYPO3 ](https://b13.com/de/wissen/gestatten-t3ppy-ein-neues-zeitalter-fuer-die-redaktionsarbeit-in-typo3)
- ![Retro-Mikrofon-Illustration mit einem Einkaufswagen-Symbol im Hintergrund, das E-Commerce oder Online-Shopping symbolisiert.](https://b13.com/fileadmin/_processed_/f/8/csm_Marketplace_Headerbild_ee1575614c.webp)

    ###  Warum TYPO3 einen Marketplace für Produkte braucht

     25. März 2026 | Florian “Flix” Keitgen

     Ein Marketplace würde TYPO3-Produkte sichtbarer machen, den Vergleich erleichtern und Agenturen sowie Kunden gleichermaßen profitieren lassen.

     [ weiterlesen: Warum TYPO3 einen Marketplace für Produkte braucht ](https://b13.com/de/wissen/warum-typo3-einen-marketplace-fuer-produkte-braucht)
- ![Eine Hand hält eine Lupe über den Laptop-Bildschirm, der eine Webseite mit einem Bild und Textelementen anzeigt.](https://b13.com/fileadmin/_processed_/e/5/csm_BackendUserSection_Headerbild_6093c842fd.webp)

    ###  Ein echter Geheimtipp in TYPO3: Die Backend User Section (Doktype 6)

     05. März 2026 | David Steeb

     Entdecke den oft unterschätzten Doktype 6 (Backend User Section) in TYPO3 für sichere interne Vorschauen, Redaktionstrainings und Prototyping. Erfahre praxisnahe Anwendungsfälle,…

     [ weiterlesen: Ein echter Geheimtipp in TYPO3: Die Backend User Section (Doktype 6) ](https://b13.com/de/wissen/ein-echter-geheimtipp-in-typo3-die-backend-user-section-doktype-6)
- ![Zwei stilisierte Webseiten-Designs mit einem Benutzerprofil, Platzhaltern für Bilder und Textabschnitten, vor einem hellblauen Hintergrund.](https://b13.com/fileadmin/_processed_/2/0/csm_BackendPreview_Headerbild_b4c5799cfa.webp)

    ###  Backend-Content-Previews mit System — warum wir EXT:backendpreviews entwickelt haben

     09. Februar 2026 | David Steeb

     EXT:backendpreviews sorgt für konsistente Content-Previews im TYPO3-Backend mit Fluid Templates, Layouts und Partials.

     [ weiterlesen: Backend-Content-Previews mit System — warum wir EXT:backendpreviews entwickelt haben ](https://b13.com/de/wissen/backend-content-previews-mit-system-warum-wir-extbackendpreviews-entwickelt-haben)
- ![Eine menschliche Hand schüttelt eine Roboterhand vor einem lila Hintergrund mit Herzmustern, was die Zusammenarbeit zwischen Menschen und Technologie symbolisiert.](https://b13.com/fileadmin/_processed_/6/2/csm_AIbotsLoveMarkdown_Headerbild_72fe5820d6.webp)

    ###  Das Internet ist nicht mehr nur für Menschen — KI-Bots lieben Markdown

     28. Januar 2026 | Benni Mack

     Discover why most web traffic is now automated and how TYPO3’s structured content model prepares websites for humans, editors, and AI systems.

     [ weiterlesen: Das Internet ist nicht mehr nur für Menschen — KI-Bots lieben Markdown ](https://b13.com/de/wissen/das-internet-ist-nicht-mehr-nur-fuer-menschen-ki-bots-lieben-markdown)
- ![Mehrere farbenfrohe Mockups von Webseiten, die übereinander gestapelt sind und verschiedene Layouts sowie Designelemente vor einem lila Hintergrund präsentieren.](https://b13.com/fileadmin/_processed_/e/3/csm_CaminoTheme_Headerbild_d082598009.webp)

    ###  Camino—The Need for a Default Theme in TYPO3 Is Real

     27. Januar 2026 | Benni Mack

     With TYPO3 v14, Camino introduces a default theme that removes friction from first installs. Why this matters—and how TYPO3 laid the groundwork.
- ![Grafik mit stilisierten Darstellungen eines Turms, in dessen Mitte der Text "T3CON25 Düsseldorf" deutlich sichtbar ist.](https://b13.com/fileadmin/_processed_/7/b/csm_T3CON2025_Headerbild_fc9c5cc53e.webp)

    ###  T3CON25 — der Zukunft des Content Managements einen Schritt näher

     10. Dezember 2025 | Franzi Töpler

     Die T3CON25 zeigte die Zukunft von TYPO3 mit Einblicken in TYPO3 v14, KI, digitale Souveränität und Open-Source-Lösungen für moderne, sichere Webauftritte.

     [ weiterlesen: T3CON25 — der Zukunft des Content Managements einen Schritt näher ](https://b13.com/de/wissen/t3con25-der-zukunft-des-content-managements-einen-schritt-naeher)
- ![Bunte Sneakers sind in einem Muster angeordnet, mit einem zentralen Logo, das 'TYPO3 Code Sprint' zeigt.](https://b13.com/fileadmin/_processed_/6/c/csm_CodesprintGenf25_Headerbild_c44149748c.webp)

    ###  Code, Collaboration und Community: Meine Woche beim TYPO3 v14 Feature Sprint in Genf

     05. November 2025 | Oliver Bartsch

     Fünf Tage, 14 Contributors, unzählige Ideen — und 55 Patches erstellt!
     Unser Team von b13 war beim TYPO3 v14 Feature Sprint in Genf dabei, um wichtige Verbesserungen für…

     [ weiterlesen: Code, Collaboration und Community: Meine Woche beim TYPO3 v14 Feature Sprint in Genf ](https://b13.com/de/wissen/code-collaboration-und-community-meine-woche-beim-typo3-v14-feature-sprint-in-genf)