从我调用akka.http.scaladsl.Http.apply()时提供的隐式是什么?

时间:2016-02-21 07:44:41

标签: scala implicit akka-http

我正在使用Akka HTTP支持REST,我需要在另一部分使用Actors 服务器我正在开发。我的理解是,通常需要使用一个ActorSystem 在整个应用程序中的实例。从akka.http.scaladsl.Http.apply()的定义来看, 似乎当我使用Http方法时,如下面代码中的代码段 -

val service: FooRestService = new FooRestService()
Http(). bindAndHandle(service.route, "localhost", 8080)   // something is supplying the imply method w/ implicit ActorSystem ! 

---不知怎的,Http对象的apply()方法被提供了一个隐式的ActorSystem实例...为了便于参考,Http.apply()定义如下:

package akka.http.scaladsl.Http
        ...
    object Http {
        ...
      def apply()(implicit system: ActorSystem): HttpExt = super.apply(system)

由于我需要坚持一个ActorSystem实例,我想在我的系统中提供其他(非REST)基于Actor的代码 SAME引用作为提供给Http apply()方法的引用。

我猜测我的代码必须使用带有隐式ActorSystem的包对象对包进行包导入,或者在那里 必须是另一种方式,这隐含的是在夜深人静的时候像一个忍者一样滑倒。我捅了很多, 但无法理解; ^(

任何建议都非常感谢!

2 个答案:

答案 0 :(得分:1)

我不确定我完全理解你的问题是什么,但是你的每个演员都有context: ActorContext。您可以从ActorSystem获取context.system。因此,您不需要明确传递ActorSystem

答案 1 :(得分:0)

以下是我使用@ expert的答案(上图)来调试隐含来自的地方。关键是从获取隐式的Actor转储出系统变量..然后查看名称以找出隐含来自的位置。在我的情况下,隐含来自我自己的代码(多么愚蠢!)。无论如何..感谢上面的答案我的问题已经解决了。

    val http: HttpExt = Http()
    val sys = http.system
    System.out.println("sys:" + sys);
    http. bindAndHandle(
        service.route, "localhost", injector.getInstance(classOf[Conf]).getInt(PROVISIONER_PORT )
      )