当我引用类型化的actor系统时,如何为AkkaStreams实例化实现器?

问题描述 投票:0回答:2

下面的代码无法编译,它表示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()
scala akka akka-stream akka-typed
2个回答
0
投票

[2.6.x的Akka文档指示已弃用ActorMaterializer:“使用具有流属性或配置设置的系统范围的Materializer或Materializer.apply(actorContext)来更改默认值。”

改用它:

import akka.Done
import akka.actor.ActorSystem
import akka.actor.typed.Behavior
import akka.actor.typed.scaladsl.Behaviors
import akka.stream.Materializer


object Main {

  def main(Args: Array[String]) : Unit = {
    val guardian: Behavior[Done] = Behaviors.setup(_ => {
      Behaviors.receiveMessage{
        case Done => Behaviors.stopped
      }
    })

    val as = ActorSystem()
    val materializer = Materializer(as)
  }
}

0
投票

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

因此,如果在Akka类型的Behavior中实现流,则将

implicit val materializer = context.classicActorContext.system

并且如果在actor之外实现流,但是您在其中键入了ActorSystem

implicit val materializer = typedActorSystem.classicSystem
© www.soinside.com 2019 - 2024. All rights reserved.