2016-09-08 2 views
4

Mit akka http, um an einen Port zu binden und dann eingehende Verbindungen zu routen, ist angesichts der einfach genug.Verwenden von Akka Http für mehrere Bindungen

Eine nicht angesprochene Frage ist, wie man mehrere Ports für verschiedene Routen bindet. Wenn ich mehrere Spezifikationen haben:

val route1 : Flow[HttpRequest, HttpResponse,_] = ??? 
val interface1 : String = ??? 
val port1 : Int = ??? 

val route2 : Flow[HttpRequest, HttpResponse,_] = ??? 
val interface2 : String = ??? 
val port2 : Int = ??? 

Sollten diese mit einer HttpExt gebunden werden?

implicit val actorSystem : akka.actor.ActorSystem = ??? 

val httpExt = akka.http.scaladsl.Http() 

httpExt.bindAndHandle(route1, interface1, port1) 
httpExt.bindAndHandle(route2, interface2, port2) 

Oder sollte eine andere HttpExt für jede bind verwendet werden?

Wenn beides gültig ist, gibt es dann irgendwelche Implikationen für die Verwendung einer Methode gegenüber der anderen?

Vielen Dank im Voraus für Ihre Bewertung und Antwort.

+0

Dies wird Ihre Frage beantworten: Http() eq Http() –

+0

@ viktorklang Das bringt Klarheit in die Frage. Wenn jedoch ein Aufruf von "Http()" irgendwelche Nebenwirkungen hat, z.B. Auf dem 'ActorSystem' würde dann die Objektgleichheit das Verhalten nicht vollständig erklären. –

+0

In meiner Antwort unten habe ich einen Verweis auf den Code, der zeigt, dass der zweite 'Http()' Aufruf keine Nebenwirkungen hat. – Tim

Antwort

4

Eine kleine Quellcodeuntersuchung zeigt folgendes.

Here wir sehen, was passiert bei Http() Anruf. Http Objekt erweitert ExtensionId[HttpExt] Merkmal, das für die Registrierung zusätzlicher Funktionalität mit Actor-System verantwortlich ist. This ist das super Anruf. Wie wir sehen können, verwendet es this Referenz, die in unserem Fall in einem Objekt Referenz (wichtig). Here ist was tatsächlich passiert, wenn wir Http() anrufen. Als Erstes überprüft dieser Code, ob die Erweiterung bereits registriert ist. Denken Sie daran, dass ext in unserem Fall ein Objekt ist, so dass alle nachfolgenden Aufrufe nach dem ersten nichts tun werden.

Dies bedeutet, dass einer Ihrer Ansätze würde die gleiche funktionieren, aber imo mit einem httpExt ist weniger verwirrend, da das zugrunde liegende System wirklich funktioniert.