Skip to main content

Wir integrieren das FirstSpirit UX-Bridge Modul

Das FirstSpirit CMS von e-Spirit ist auf das Vorgenerieren und Publizieren von Inhalten spezialisiert. In realen Projekten gibt es neben rein statischen natürlich viele dynamisch erzeugte Inhalte (z.B. Personalisierung) und Interaktionsmöglichkeiten für den Nutzer. Mit dem UX-Bridge (UXB) Modul verbindet e-Spirit die Vorteile von statisch generierten Inhalten mit der Aktualität von dynamisch integrierten Informationen und Funktionen.

e-Spirit selbst beschreibt das Modul als „Infrastruktur-Modul für hochdynamische Webseiten zur Verbesserung der User Experience“. Die Informationen im Marketplace erläutern zwar das fachliche Konzept und die Möglichkeiten, die sich durch den Einsatz von UX-Bridge bieten. Dennoch bleibt die Frage: Was verbirgt sich technisch hinter dem UX-Bridge Modul? Für welche konkreten Anwendungsfälle kann es genutzt werden und wo liegen die Stärken und Schwächen? Diese Fragen waren für uns der Grund, die technische Integration der UX-Bridge an praxisrelevanten Szenarien auszuprobieren und zu bewerten.

Was ist UX-Bridge?

Bei der ersten Betrachtung erweist sich UX-Bridge als klassischer Enterprise Service Bus (ESB). Das äußert sich vor allem durch den verwendeten Technologie-Mix bestehend aus Apache ActiveMQ, Apache Camel und KahaDB. Eine Kombination die man auch bei anderen ESB Produkten findet.

e-Spirit stellt einen bereits vorkonfigurierten UX-Bus-Server als eigenständige Anwendung zur Verfügung. Die Aufgabe des UX-Bus-Servers ist der Empfang von XML-Nachrichten und die Weiterleitung an sogenannte Adapter. Ein Adapter kann sich am Bus anmelden und auf die empfangenen Nachrichten reagieren. Nachrichten können vom FirstSpirit Server bei einer Generierung, aber auch bei der Freigabe oder dem Löschen eines Datensatzes erzeugt und über das separate UX-Bridge Modul an den UX-Bus-Server übermittelt werden. Für den Transfer hat FirstSpirit als Nachricht die sogenannte UXB-Entity definiert. Diese enthält neben fest definierten Attributen vor allem frei definierbaren Content. Da der Content nicht festgelegt ist kann man XML, JSON oder beliebige Text-Formate (z.B. serialisierte Java Objekte) als Payload verwenden. Letztendlich muss der Empfänger-Adapter wissen wie er den Inhalt interpretiert.

Für welche Usecases kann UX-Bridge eingesetzt werden?

Das UX-Bridge Modul kann als Integrationslösung für viele verschiedene Szenarien genutzt werden. In diesem Artikel haben wir einen aus unserer Sicht sehr praxisrelevanten Usecase herausgegriffen, implementiert und bewertet.

Der klassische Publizierungs-Prozess bei FirstSpirit ist die Vorgenerierung von Inhalten und Medien auf dem CMS-System (FirstSpirit-Server) und die anschließende Übertragung auf ein Live-System (Web-Server). In realen Projekten werden neben diesen rein statischen Inhalten und Medien auch strukturierte Daten in einem am CMS angeschlossenen Data Repository (z.B. relationale Datenbank) gespeichert, um diese dynamisch ausspielen zu können. Oftmals sind aus Sicherheitsgründen CMS-System und Live-System durch eine Firewall voneinander getrennt. Die statischen Inhalte und Medien können über standardisierte Sync-Methoden (z.B. rsync over ssh) in der Regel ohne Probleme durch die Firewall auf das Live-System übertragen werden. Der Zugriff vom Live-System durch die Firewall hindurch auf das interne Data Repository ist jedoch oftmals aus Sicherheitsgründen nicht möglich. Daher erhält das Live-System in diesem Fall ein eigenes Data Repository, auf welches dann die Datensätze vom CMS-System übertragen werden müssen. Diese Data Repository Synchronisierung ist oftmals nicht so einfach möglich, wie bei statischen Inhalten und Medien.

Genau hier kann die die UX-Bridge ihre Stärken ausspielen. Kerngedanke ist, dass beliebige Daten vom CMS-Server über die UX-Bridge an einen Adapter gesendet werden. Dieser Adapter ist wiederum an ein externes Data Repository angebunden, in dem er die empfangenen Daten ablegt. Das externe Data Repository kann eine relationale Datenbank (z.B. MySQL), eine dokumentenorientierte Datenbank (z.B. MongoDB), aber auch ein Such- bzw. Index-Dienst (z.B. Lucene/Solr) sein. Die Web-Applikation kann auf das externe Data Repository zugreifen und dynamische Abfragen stellen.

Zielsetzung unserer Implementierung war es zwei verschiedene Data Repositories mit FirstSpirit Datensätzen zu befüllen. Dazu muss auf dem FirstSpirit Server ein neuer UXB Ausgabekanal erstellt werden, der als Ausgabe eine einzelne UXB-Entity in Form von XML generiert. Bei der Generierung kann man durch einen speziellen Generierungsschritt, der aus einem Skriptaufruf besteht, den UX-Bridge-Service aktivieren. Dieser interpretiert alle nachfolgend generierten Seiten als UXB-Entity und schickt das XML an den UX-Bus.

Für die Implementierung des Adapters waren die Beispiele von e-Spirit eine gute Ausgangsbasis. Die Adapter können sich am UX-Bus für einen sogenannten virtuellen Topic anmelden. Sie enthalten dann alle Nachrichten, die zu diesem Topic geleitet werden. In der Standardkonfiguration des UX-Bus-Servers gibt es einen virtuellen Topic zu dem alle Nachrichten aus dem FirstSpirit Server geleitet werden. Die Besonderheit eines virtuellen Topics ist, dass automatisch eine neue Nachrichten-Queue im Bus erstellt wird, wenn ein Adapter sich anmeldet. Dabei gilt, dass die Queue auch erhalten bleibt, wenn der Adapter sich vom Bus abmeldet. Die Nachrichten werden dann solange vorgehalten, bis der Adapter wieder „online“ ist. Identifiziert wird ein Adapter über einen frei wählbaren Namen beim Anmelden an einen virtuellen Topic. D.h für jeden eindeutigen Namen gibt es eine eigene Queue. Wenn es mehrere Adapter mit dem gleichen Namen gibt, melden sich diese an der gleichen Queue an und es findet automatisch ein Loadbalancing statt. Dabei werden die Nachrichten gleichmäßig auf die Adapter der Queue verteilt.

In unserem Testszenario benötigen wir zweimal den gleichen Adapter, jedoch jeweils mit unterschiedlichem Namen. Dafür muss im Camel-Context des Adapters ein Endpoint angelegt werden. Den Namen des Adapters holen wir uns mit Hilfe der PropertyPlaceholderConfigurer Bean von Spring aus einer Property Datei.

<endpoint id="fromEndpoint" uri="activemq:Consumer.${consumer-name}.VirtualTopic.BUS_OUT" />

Anschließend haben wir beide Adapter jeweils mit dem Namen Adapter-SQL1 und Adapter-SQL2 als Webapp auf zwei verschiedenen Tomcat Servern gestartet. Weil wir den Enpoint an einem virtuellen Topic angemeldet haben, hat der UX-Bus-Server auch automatisch zwei Message-Queues angelegt.

UX-Bridge UX-Bus Message Queue

Die beiden Adapter können nun die Messages aus ihrer individuellen Queue abholen und verarbeiten. Im Camel Context hat man die Möglichkeit über JAXB Annotations die XML Nachrichten aus dem Bus auf Objekte zu mappen und anschließend die transformierten Objekte zu verarbeiten.

<convertBodyTo type="de.empulse.firstspirit.uxbridge.adapter.test.model.UXBContactEntity" />
<bean ref="dbService" method="store" />

In unserem Szenario bestand die Weiterverarbeitung der JAXB Objekte dann aus simplen Insert-, Update- oder Delete-Statements, die wir auf Basis der Objekte erzeugt und via JDBC zum angebundenen SQL-Server gesendet haben.

Somit können wir mithilfe von UX-Bridge erfolgreich neben den rein statischen Inhalten und Medien auch strukturierte Daten zwischen verschiedenen Systemen synchronisieren. Das schöne an der UX-Bridge Lösung ist, dass dies nahtlos in den üblichen Publizierungs-Prozess integriert ist. Dadurch entstehen auch keine inkonsistenten Zustände auf dem Live-System, da Inhalte, Medien und Daten in einer gemeinsamen Transaktion zum Live-System synchronisiert werden.

Fazit und Ausblick

Ein großer Vorteil der UX-Bridge ist, dass einzelne Komponenten sehr klar von einander entkoppelt sind. Weiterhin skaliert dieser Lösungsansatz sehr gut, da man beliebig viele Adapter anmelden und dadurch Loadbalancing betreiben kann. Der Bus Server selbst kann bei Bedarf im Cluster betrieben werden.

Interessant ist die Frage, wie Nachrichten aus dem UX-Bus wieder zurück in den FirstSpirit Server übertragen werden können. Beispielsweise könnte man eine Kontaktanfrage an den FirstSpirit Server leiten und dort über die API in den Datenquellen speichern. Leider ist dieser „Rückkanal“ in der Dokumentation nicht beschrieben. Hier muss sich ein Entwickler die Lösung eigenständig erarbeiten.

Auf Basis der UX-Bridge lassen sich natürlich viele weitere spannende Usecases identifizieren und implementieren. Wir werden unsere Erfahrungen in weiteren Artikeln gerne mit Ihnen teilen.

Weitere Informationen:

Über den Autor

empulse Team

Unser kompetentes und erfahrenes Team von (Java-)Entwickler ist stark in Beratung, technischer Konzeption und zuverlässiger Umsetzung komplexer Projekte. In unseren Reihen haben wir Spezialisten für unterschiedliche Themengebiete, die hier ihr Fachwissen zum Besten geben.