当我有对类型化actor系统的引用时,如何为 AkkaStreams 实例化一个物化器?

Nic*_*oiu 3 scala akka akka-stream akka-typed

下面的代码不能编译,它说 ActorMaterializer 缺少一个隐式的 ActorRefFactory。我该如何提供?

val guardian: Behavior[Done] = Behaviors.setup(_ => {
  Behaviors.receiveMessage{
    case Done => Behaviors.stopped
  }
})
implicit val sys = ActorSystem(guardian, "sys")
implicit val materializer: Materializer = ActorMaterializer()
Run Code Online (Sandbox Code Playgroud)

Lev*_*sey 5

Akka Streams 此时需要一个“经典”(无类型)ActorSystem,它可以隐式转换为物化器。

因此,如果在 Akka Typed 中具体化一个流Behavior,人们会

implicit val materializer = context.classicActorContext.system
Run Code Online (Sandbox Code Playgroud)

如果在演员之外具体化一个流,但你有一个类型ActorSystem

implicit val materializer = typedActorSystem.classicSystem
Run Code Online (Sandbox Code Playgroud)

正如@johanandren所提到的,我们还可以将 Typed 放入ActorSystem隐式作用域中,这将允许隐式转换Materializer生效。

implicit val materializer = context.classicActorContext.system
Run Code Online (Sandbox Code Playgroud)


joh*_*ren 5

以前的答案是独立的新 API 的一半。

类型化ActorSystem也可以隐式转换以提供系统实现器,因此仅将其作为隐式可用就足够了。

例如:

Behaviors.setup { ctx =>
 implicit val system = ctx.system

 Source(1 to 10).runForeach(println)

 ...
}
Run Code Online (Sandbox Code Playgroud)

它的内部工作是从Materializer伴随对象中可用的隐式转换,它将 a 的系统实现器提取ClassicActorSystemProvider为 a Materializer。类型化和经典ActorSystem实现ClassicActorSystemProvider