远程演员没有回应识别?

时间:2018-04-10 13:13:27

标签: scala akka

我只是搞乱了一些基础知识来学习akka远程处理,而且我遇到了一个问题,我的代理类向我的后端发送了Identify个消息,但从未收到回复。

我已验证后端收到发送到ActorSelection的消息,并且我看到了一条日志消息,其中后端演员表示将使用xxx序列化{{1}消息。不确定我在哪里弄错了。

这是我的代理类:

ActorIdentity

这是我的后端课程:

package remoting

import akka.actor.{Actor, ActorIdentity, ActorRef, Identify, ReceiveTimeout, Terminated}
import com.typesafe.config.ConfigFactory

import scala.concurrent.duration._

class BackendProxyActor extends Actor {
  context.setReceiveTimeout(3.seconds)

  val path = createPath

  val backendSelection = context.actorSelection(path)

  println(f"BackendSelection is $backendSelection")

  override def preStart(): Unit = backendSelection ! Identify(1)

  override def receive: Receive = {
    case ActorIdentity(1, Some(actor)) =>
      context.setReceiveTimeout(Duration.Undefined)
      context.watch(actor)
      context.become(active(actor))

    case ActorIdentity(1, None) =>
      println("Backend actor not available")

    case ReceiveTimeout =>
      backendSelection ! Identify(1)

    case msg: Any => println(f"Received $msg while identifying backend")
  }

  def active(backend: ActorRef): Receive = {
    case msg: Any => backend ! msg

    case Terminated(backend) =>
      println("backend terminated, going to identifying state")
      context.setReceiveTimeout(3.seconds)
      context.become(receive)
  }

  def createPath: String = {
    val config = ConfigFactory.load("frontend").getConfig("backend")
    val name = config.getString("name")
    val host = config.getString("host")
    val port = config.getString("port")
    val system = config.getString("system")
    val protocol = config.getString("protocol")
    f"$protocol://$system@$host:$port/$name"
  }
}

我的前端课程:

package remoting

import akka.actor.{Actor, Identify, PoisonPill}
import com.typesafe.config.ConfigFactory

class BackendActor extends Actor {
  val config = ConfigFactory.load("backend")

  override def receive: Receive = {
    case "stop" => self ! PoisonPill

    case msg: Any => println(f"Received $msg")
  }
}

最后是我的App类:

package remoting

import akka.actor.{Actor, Props}

class FrontendActor extends Actor {

  val proxy = context.actorOf(Props[BackendProxyActor], "backendProxy")

  override def receive: Receive = {
    case msg: Any => proxy ! msg
  }
}

我的后端正在另一个进程中启动,并在端口2551上运行,而我的前端在2552端口。

0 个答案:

没有答案