Scala: cómo implementar una API REST con un sistema de actor tipo akka

CorePress2023-11-30  1

Estoy intentando iniciar una API REST usando Scala con akka-http. Soy nuevo en el paradigma del modelo de actor y akka, así que quiero implementar un sistema de actor escrito, pero recibo este error de compilación de sbt:

could not find implicit value for parameter system: akka.actor.ActorSystem (implicit ActorRefFactory required: if outside of an Actor you need an implicit ActorSystem, inside of an actor this should be the implicit ActorContext)
[error]     val bindingFuture = Http().bindAndHandle(route, "localhost", 8080)

¿Alguna idea de lo que está pasando aquí? Este es mi código basado en un ejemplo de la documentación de akka:

object FeedAggregatorServer {
  def apply(): Behavior[Nothing] =
    Behaviors.setup[Nothing](context => new FeedAggregatorServer(context))
}

class FeedAggregatorServer(context: ActorContext[Nothing]) extends AbstractBehavior[Nothing](context) {
  context.log.info("Application started")

  override def onMessage(msg: Nothing): Behavior[Nothing] = {
    // No need to handle any messages
    Behaviors.unhandled
  }

  override def onSignal: PartialFunction[Signal, Behavior[Nothing]] = {
    case PostStop =>
      context.log.info("Application stopped")
      this
  }

}

object FeedAggregatorApp {

  def main(args: Array[String]): Unit = {
    ActorSystem[Nothing](FeedAggregatorServer(), "FeedAggregatorServer")

    val route =
      concat (
        path("") {
          complete("Hello, World!")
        },
        path("feed") {
          complete("Hello!")
        }
      )

    val bindingFuture = Http().bindAndHandle(route, "localhost", 8080)
    println(s"Server online at http://localhost:8080/\nPress RETURN to stop...")
    StdIn.readLine() // let it run until user presses return
    bindingFuture
      .flatMap(_.unbind()) // trigger unbinding from the port
      .onComplete(_ => system.terminate()) // and shutdown when done
  }

}

¿El enrutamiento debería estar en FeedAggregatorServer tal vez o...?

  • Akka Http utiliza el sistema de actor clásico y es posible que deba convertir el sistema escrito al sistema clásico. doc.akka.io/docs/akka/current/typed/coexisting.htmyo - Shankar Shastri 7 de junio de 2020 a las 3:01


------------------------

Necesitas definir un akka.actor.ActorSystem implícito (nota, se requiere un sistema de actor clásico, aunque esto cambiará en futuras versiones de akka-http) al crear tu servidor akka-http. Puede obtener más información sobre la interoperación entre sistemas de actores clásicos y tipificados en los documentos de akka (como se menciona en https://stackoverflow.com/users/4268228/shankar-shastri).

Según tu código querrás proporcionar implícitamente el sistema de actor clásico así:

// you could move this to your other imports
import akka.actor.typed.scaladsl.adapter._

val typedSystem = ActorSystem[Nothing](FeedAggregatorServer(), "FeedAggregatorServer")
implicit val classicSystem = typedSystem.toClassic
...
Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare