On the ROXX: Flex, REST, Akka, Scala, MongoDB

Scala

Scala ist, wie Java, eine Sprache für die JVM. Dabei lassen sich Java- und Scala-Bibliotheken wechselseitig verwenden. Möglich ist dies durch die simple Tatsache, dass alle JVM-Sprachen in einheitlichen Bytecode übersetzt werden, der in der Laufzeitumgebung (JVM) abläuft. Scala ist eine statisch typisierte, objektfunktionale Sprache. Objektfunktional bedeutet, dass sich sowohl objektorientiert als auch funktional programmieren lässt. Funktionale Sprachen liegen momentan stark im Trend, unter anderem, weil sie es einem sehr viel einfacher machen, hochparallelisierbaren Code zu erstellen – eine Anforderung, die in fast jedem Webprojekt eine zentrale Rolle spielt. Außerdem bietet Scala gegenüber Java eine Reihe weiterer Vorteile, die hier aus Platzgründen jedoch außen vor bleiben müssen. Interessierten Lesern sei an dieser Stelle eines der wenigen deutschsprachigen Scala-Bücher empfohlen [4].

MongoDB

MongoDB ist eine dokumentenorientierte Datenbank und somit ein Vertreter des Datenbanktyps NoSQL, der derzeit in aller Munde ist. MongoDB speichert seine Daten im BSON-Format (Binäres JSON) und passt somit wunderbar zum übrigen Technologie-Stack. Wir verwenden in ROXX die Bibliothek casbah [5], um auf MongoDB zuzugreifen. Populärer ist jedoch das JavaScript API für MongoDB, das auch durchgängig in der Dokumentation von MongoDB verwendet wird. MongoDB bietet eine integrierte Query Language mit MapReduce. Außerdem lassen sich gespeicherte Objekte über eine ObjectID referenzieren. Zudem ist MongoDB auf hohe Skalierbarkeit und Verfügbarkeit ausgelegt und somit hervorragend für typische Web-2.0-Projekte geeignet. Ein Beispiel für das Laden eines Mongo-DB-Objekts anhand seiner ID ist in Listing 3 zu sehen. Auch an dieser Stelle eine deutschsprachige Literaturempfehlung [6].

Listing 3: RoxxActor.scala
override protected def receive = {
  // Scala Pattern-Matching: Ist der Request vom Typ Get, dann übergib mir in der Variablen 'id' das Rest Attribut für den Teil 'route'. Anschließend rufe die Funktion getRoute auf mit dem http-Request-Objekt und der ID als String-Parameter
    case get @ Get("route", id) =>
      getRoute(get, id)
...  }
val db = MongoConnection(url, port.toInt).getDB("roxx")
private val routesCollection = roxxDb("routes")

private def getRoute(requestMethod: RequestMethod, id: String) {
 // Suche in der MongoDB Collection 'routesCollection' nach einem Eintrag mit der id 'id'
 (routesCollection findOne MongoDBObject("_id" -> new ObjectId(id))) flatMap {
 // mit flatMap wird dieser Zwei nur betreten, wenn ein Eintrag gefunden wurde
 // erstelle aus dem mongoDBObject ein Route-Objekt
 mongoDbObject => Route fromMongoDbObject mongoDbObject
} map {
// die Verwendung von map garantiert, dass aus dem Datensatz von der DB ein Scala-Objekt 'Route' erzeugt werden konnte diese Route wird in den http-Request mit dem Response-Code ok verpackt und als JSON an den Client gesendet
        route => requestMethod.OK(JsonSerialization tojson route toString)
}
Kommentare

Schreibe einen Kommentar

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