2016-09-08 7 views
4

をアッカHTTPを使用すると、documentation与えられた十分に簡単です。ポートにバインドして、ルートの着信接続するアッカHTTPを使用して複数のバインディングのため

解決されていない1つの質問は、異なるルートの複数のポートをバインドする方法です。私は複数の仕様がある場合:

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

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

は、これらは1 HttpExtで拘束されるべきか?

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

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

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

または、それぞれのバインドに異なるHttpExtを使用する必要がありますか?

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

のいずれかが有効である場合には、他の上の一つの方法を使用するためのいずれかの影響がありますか。

ご参考までに、よろしくお願い致します。

+0

これは、あなたの質問answetます:HTTP()EQのHttpを()の質問にいくつかの明快さを加えるん –

+0

@viktorklang。しかし、 'Http()'の呼び出しに副作用がある場合、例えば、 'ActorSystem'では、オブジェクトの同等性は動作を完全には説明しません。 –

+0

以下の私の答えでは、2番目の 'Http()'呼び出しに副作用がないことを示すコードへの参照があります。 – Tim

答えて

4

少しのソースコード調査では、以下のことが分かります。

Here我々はHttp()呼び出しで何が起こるかを参照してください。 HttpオブジェクトはExtensionId[HttpExt] traitを拡張します。これはactorシステムで追加機能を登録する役割を果たします。 Thisは、superコールです。我々が見ることができるように、thisの参照を使用しています。これは、私たちの場合はオブジェクト参照(重要)です。 Hereは、Http()に電話すると実際に何が起こるかです。このコードが最初に行うことは、拡張が既に登録されているかどうかをチェックすることです。この場合、extがオブジェクトであることを覚えておいてください。最初の呼び出しの後に続く呼び出しは何も行いません。

これはあなたのアプローチのいずれかが同じように動作することを意味するが、芋1 httpExtを使用すると、基礎となるシステムが実際にどのように機能するかを考えると、あまり混乱です。