vert.x: asynchrones und Event-getriebenes Java-Webframework

Seite 2: Fazit

Inhaltsverzeichnis

Verticles können zudem untereinander kommunizieren. Dazu nutzt vert.x einen Event Bus, was dem asynchronen Ansatz entspricht. Die Events auf dem Bus werden über vert.x-Instanzen weitergeleitet, sodass man über Prozesse hinweg kommunizieren kann. Weiterhin gibt es Datenstrukturen, die sich gemeinsam nutzen lassen. Der parallele Zugriff auf den Zustand ist aber für die hohe Komplexität nebenläufiger Programmierung verantwortlich. Daher sind die Möglichkeiten im Framework recht begrenzt, aber in einigen Situationen, zum Beispiel für einen Cache, müssen solche Lösungen vorhanden sein. vert.x stellt dafür Sets und Maps zur Verfügung. Ein Beispiel zeigt das folgende Listing:

public class Fanout extends Verticle {

public void start() {
final Set<String> writeHandler =
vertx.sharedData().getSet("conns");

vertx.createNetServer().connectHandler(new Handler<NetSocket>(){
public void handle(final NetSocket socket) {
writeHandler.add(socket.writeHandlerID);
socket.dataHandler(new Handler<Buffer>() {
public void handle(Buffer buffer) {
for (String handler : writeHandler) {
vertx.eventBus().send(handler, buffer);
}
}
});
socket.closedHandler(new SimpleHandler() {
public void handle() {
writeHandler.remove(socket.writeHandlerID);
}
});
}
}).listen(1234);
}}

Die Anwendung nimmt eine Verbindung unter dem Port 1234 entgegen. Im Set writeHandler speichert jeder Callback die Adresse des Event Handler, den vert.x für einen Socket automatisch registriert. Alle Nachrichten an diesen Handler gibt der Socket aus. Die Anwendung registriert für den Socket außerdem einen Handler, den vert.x bei eintreffenden Daten aufruft. Dieser Handler schickt die vom Socket empfangenen Daten an den Event Bus, und zwar an jeden in writeHandler registrierten Event Handler. Wenn also eine Nachricht auf einem Socket eintrifft, wird sie an alle Sockets weitergeschickt.

Das Listing erklärt demnach die Nutzung von gemeinsamen Datenstrukturen und Event Bus. Mit den beiden Elementen ist es einfach, auch komplexere Anwendungen zu implementieren.

Da vert.x mit dem Java-EE-Modell (Java Enterprise Edition) vollständig bricht, muss es eine eigene Ablaufumgebung anbieten. Wie erwähnt schreibt ein Entwickler Verticles. Sie können in einer eigenen vert.x-Instanz laufen. Dazu dient beispielsweise diese Kommandozeile:

vertx run de.adesso.WebsocketsEcho -cp ../classes/ -instances 2

mit der man eine neue vert.x-Instanz startet, mit einem ClassPath versieht und zwei Event Loops gestartet werden sollen. Die Anwendung lastet also zwei Kerne aus.

Zudem kann man einen vert.x-Server starten und dann Verticles auf dem Server laufen lassen. Für das Installieren und Deployen von Verticles bietet vert.x eine API, sodass sich diese Prozesse auch automatisieren lassen. Ebenso ist es möglich, vert.x mit Modulen zu erweitern. Beispielsweise bietet vert.x einen Webserver als Modul und einen MongoDB-Persistierer. Besondere Module sind busmods, die nur über den Event Bus kommunizieren und so noch stärker von der Anwendung entkoppelt sind.

Ein Konzept für eine solche Erweiterung eines Servers vermissen Java-EE-Entwickler typischerweise. vert.x bietet hierfür ein Modularisierungskonzept, das wesentlich einfacher als beispielsweise OSGi ist.

vert.x nutzt die Stärken der JVM wie eine hochoptimierte Ablaufumgebung. Dabei unterstützt es mit dem asynchronen Ansatz ein völlig anderes Programmiermodell als andere Ansätze aus der Java-Welt. Das ist vor allem nützlich, wenn viele Verbindungen gleichzeitig offen zu halten sind, wie das wegen WebSockets notwendig ist. Aber auch sonst sollten vert.x-Anwendungen eine gute Skalierbarkeit bieten und recht performant sein. vert.x stellt damit eine neue Alternative zum Java-EE-Programmiermodell dar, die zudem seine eigene Ablaufumgebung mitbringt.

vert.x steht unter der Apache-Lizenz. Die Website begrüßt ihren Besucher mit einer ausführlichen Dokumentation, auch findet man hier ein komplettes Tutorial, das die Nutzung der Technik verdeutlicht. Das Projekt wird maßgeblich von Tim Fox vorangetrieben, der bei SpringSource/VMware beschäftigt ist.

Eberhard Wolff
ist Gründungsmitglied der Java-Champions, Autor zahlreicher Fachartikel und Fachbücher und regelmäßiger Sprecher auf internationalen Konferenzen.
(ane)