Как создать экземпляр материализатора для AkkaStreams, когда у меня есть ссылка на типизированную систему акторов? - PullRequest
1 голос
/ 13 февраля 2020

Приведенный ниже код не компилируется, он говорит, что в 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()

Ответы [ 3 ]

1 голос
/ 14 февраля 2020

Akka Streams в этой точке требует "classi c" (нетипизированный) ActorSystem, который может быть неявно преобразован в материализатор.

Так что, если материализуется поток внутри типа Akka Typed Behavior, можно было бы

implicit val materializer = context.classicActorContext.system

И если материализовать поток вне актера, но там, где вы набрали ActorSystem:

implicit val materializer = typedActorSystem.classicSystem
1 голос
/ 17 февраля 2020

Предыдущие ответы на полпути к новому API с отступом.

Набранный ActorSystem может быть также неявно преобразован, чтобы обеспечить материализацию системы, поэтому достаточно просто сделать его доступным как неявное.

Например:

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

 Source(1 to 10).runForeach(println)

 ...
}

Внутренняя работа этого - неявное преобразование, доступное из объекта-компаньона Materializer, который извлекает системный материализатор ClassicActorSystemProvider в Materializer. И типизированный, и класс c ActorSystem реализуют ClassicActorSystemProvider.

0 голосов
/ 13 февраля 2020

Документация Akka для 2.6.x указывает, что ActorMaterializer деактивирован: «Используйте общесистемный материализатор или 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)
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...