1.根据自已的理解
其实spray-can的主要部分有 IO-HTTP,listener与handle
IO-HTTP是我们的system actor后,listener actor前的一个actor,他负责管理TCP,HTTP等的"管理员"
the manager actor for the given IO extension
而listener是一个注册在IO Actor的,绑定在指定的port
我们可以通过
IO(Http) ! Http.Bind(lis, interface = "localhost",port=8080)
IO(Http) ! Http.Bind(lis2,interface = "localhost",port=8081)
进行绑定,Bind的接受方其实是个 HttpListener实例,这个实例是private,只能用messages进行互动(以后可以用于stop,或者获取stats信息等),
例如向第一个HttpListener获取stats的信息
system.actorSelection("/user/IO-HTTP/listener-0") ! Http.Unbind
如果成功了lis,lis2就是request handle,可对用户请求response
绑定后
[INFO] [09/12/2015 14:53:28.084] [mySystem-akka.actor.default-dispatcher-4] [akka://mySystem/user/IO-HTTP/listener-0] Bound to localhost/127.0.0.1:8080
[INFO] [09/12/2015 14:53:28.084] [mySystem-akka.actor.default-dispatcher-7] [akka://mySystem/user/IO-HTTP/listener-1] Bound to localhost/127.0.0.1:8081
还有一个需要注意的是我们的request在"handle"居然也是一个actor,不过要注意的是这个actor是没有注册的,所以他无法远程通过actorSelect选中,这也是说我们的service actor是要保持在同一个jvm下的!