我正在使用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的包对象对包进行包导入,或者在那里 必须是另一种方式,这隐含的是在夜深人静的时候像一个忍者一样滑倒。我捅了很多, 但无法理解; ^(
任何建议都非常感谢!
答案 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 )
)