Message-Broker RabbitMQ in Java-EE-Umgebungen

RabbitMQ mit CDI integrieren

Christian Bick

RabbitMQ erfreut sich im Markt der leichtgewichtigen Message-Broker wachsender Beliebtheit. Die Kombination aus Simplizität und Robustheit machen den Broker besonders in kleinen und mittleren Unternehmen zu einer ernstzunehmenden Alternative zu etablierten Messaging-Plattformen. Dieser Artikel stellt vor, wie mit Hilfe von CDI eine elegante Einbindung von RabbitMQ insbesondere in Java-EE-Umgebungen implementiert werden kann.

RabbitMQ ist eine Open Source Message-Broker-Software, die das Advanced Message Queuing Protocol (AMQP) implementiert. Mit Hilfe dieser Middleware ist das Zusammenspiel von Komponenten einer Event-Driven-Architektur über verschiedene Plattformen hinweg deutlich einfacher geworden: Zusammen mit einer aktiven Community hat die Firma VMware Clients für die meisten gängigen Programmiersprachen hervorgebracht. RabbitMQ präsentiert sich damit insbesondere in einer heterogenen, Java-dominierten Systemlandschaft als interessante Option gegenüber dem klassischen JMS-Ansatz.

Der bereits angesprochene Java-Client von VMware ist sehr robust und unterstützt das vollständige Feature-Set von RabbitMQ. Dessen ungeachtet ist die Integration in Java EE suboptimal, was u.a. daran liegt, dass sich deutlich zu viele technische Details im fachlichen Teil des Codes befinden und – im Gegensatz zu JMS – kein standardisierter Weg der Broker-Konfiguration existiert. Diese Nachteile der RabbitMQ-Middleware können aber behoben werden.

Der naive Ansatz, JMS mit RabbitMQ zu verbinden, führt schnell zu unerfreulichen Kompromissen. Besonders heikel wird es bei dem Versuch, die verschiedenen Philosophien hinter Transaktionen zu integrieren: Während bei AMQP und somit auch bei RabbitMQ Transaktionen am Broker enden, können sie bei JMS mehrere Clients überspannen. Unter solchen Voraussetzungen erscheint es wenig erstrebenswert, diesen Ansatz weiterzuverfolgen.

Es existieren durchaus weitere Möglichkeiten, z.B. mit Hilfe von Spring Integration eine Brücke zwischen JMS und AMQP zu schlagen, doch alle haben signifikante Nachteile, sodass es sich lohnt, über Alternativen jenseits von JMS nachzudenken. Mit der Etablierung von Java EE 6 und der damit verbundenen Auseinandersetzung mit CDI (Contexts and Dependency Injection) entsprang deshalb die Überlegung, CDI Events als Ausgangspunkt für die Integration von RabbitMQ in Java EE zu nutzen.

Die Idee hinter diesem Ansatz ist folgende: CDI Events werden für das Publizieren zum Broker und das Konsumieren vom selbigem an die entsprechenden Broker-Entitäten gebunden. Bei AMQP 0.9.1 werden zum Publizieren Exchanges in Verbindung mit Routing Keys genutzt, während Queues als Quellen der Konsumenten dienen.

Folgende Grafik veranschaulicht, wie CDI Events mit Hilfe mit von RabbitMQ über Applikations-Grenzen hinweg ausgetauscht werden.

Werden in der Applikation CDI-Events gefeuert (1), so wird für zuvor gebundene Events (2) eine AMQP-Nachricht an den entsprechenden Exchange mit dem festgelegten Routing Key publiziert (3). Diese Nachrichten werden auf der Konsumenten-Seite von Queues konsumiert (4) und dann wiederum als gebundene CDI Events lokal propagiert (5). CDI Event Observer können dann auf diese Events lauschen (6).

Geschrieben von
Christian Bick
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.