Akka Remoting: множественное развертывание с использованием Props.withDeploy(...).

Я создаю образец с Akka Remote Actor с RemoteLookupProxyForwarder как определено в книге "Акка в действии". Мои требования - создать актера удаленно, но с использованием конфигурации кода. RemoteLookupProxyForwarder Это похоже на поиск удаленной системы акторов, если система акторов доступна, создайте удаленного актера, иначе подождите.

С его помощью для application.conf, это было сделано успешно и работает нормально, как аспект поведения.

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

Код актера удаленного прокси:

class RemoteLookupProxyForwarder extends Actor with ActorLogging {

  context.setReceiveTimeout(3 seconds)
  deployAndWatch

  def deployAndWatch: Unit = {
    val actor = context.actorOf(Props[RemoteActorR1], "echo")
    context.watch(actor)
    log.info("switching to may be active state")
    context.become(maybeActive(actor))
    context.setReceiveTimeout(Duration.Undefined)
  }


  def deploying: Receive = {
    case ReceiveTimeout =>
      deployAndWatch

    case msg => log.error(s"Ignoring message $msg, remote actor is not ready yet")
  }

  def maybeActive(actor: ActorRef): Receive = {
    case Terminated(actor) =>
      log.info(s"Actor $actor terminated.")
      log.info("switching to deploying state")
      context.become(deploying)
      context.setReceiveTimeout(3 seconds)
      deployAndWatch

    case msg => actor forward msg
  }

  override def receive = deploying
}

object RemoteLookupProxyForwarder {
  def props = Props(new RemoteLookupProxyForwarder)

  def name = "forwarder"
}

Удаленная 1 актерская система:

class RemoteActorR1 extends Actor with ActorLogging {

  override def receive: Receive = {
    case msg => log.info(s"Server Received $msg")
  }
}

object RemoteActorR1 {

  def main(args: Array[String]): Unit = {
    val config = ConfigFactory.parseString(conf)
    ActorSystem("remote-r1", config)
  }

  val conf =
    """
      |akka {
      |  log-dead-letters = "OFF"
      |
      |  actor {
      |    provider = "akka.remote.RemoteActorRefProvider"
      |  }
      |
      |  remote {
      |    enabled-transports = ["akka.remote.netty.tcp"]
      |    netty.tcp {
      |      hostname = "0.0.0.0"
      |      port = 2551
      |    }
      |  }
      |}
    """.stripMargin
}

Удаленная 2-х актерская система:

object RemoteActorR3 extends App {

  val uri = "akka.tcp://remote-r1@0.0.0.0:2551"
  val remoteR1Address = AddressFromURIString(uri)

  val props = Props[RemoteLookupProxyForwarder].withDeploy(
    Deploy(scope = RemoteScope(remoteR1Address))
  )

  val conf =
    """
      |akka {
      |  log-dead-letters = "OFF"
      |
      |  actor {
      |    provider = "akka.remote.RemoteActorRefProvider"
      |  }
      |
      |  remote {
      |    enabled-transports = ["akka.remote.netty.tcp"]
      |    netty.tcp {
      |      hostname = "0.0.0.0"
      |      port = 2553
      |    }
      |  }
      |}
    """.stripMargin

  val config = ConfigFactory.parseString(conf)
  val ref = ActorSystem("remote-r3", config)
  val remoteR1 = ref.actorOf(props, RemoteLookupProxyForwarder.name)

  Thread.sleep(30000)
  println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
  remoteR1 ! "Hello Dude1"
  remoteR1 ! "Hello Dude2"
  remoteR1 ! "Hello Dude3"
}

С помощью application.conf config этот пример работает нормально, потому что в config мы описываем два развертывания, но в случае кода все еще не можем найти способ определения множественного развертывания.

application.conf конфиг с развертыванием mupltiple:

val conf =
    """
      |akka {
      |  log-dead-letters = "OFF"
      |
      |  actor {
      |    provider = "akka.remote.RemoteActorRefProvider"
      |
      |    deployment {
      |     /echo {
      |       remote = "akka.tcp://remote-r1@0.0.0.0:2551"
      |      }
      |
      |     /forwarder/echo {
      |       remote = "akka.tcp://remote-r1@0.0.0.0:2551"
      |      }
      |    }
      |  }
      |
      |  remote {
      |    enabled-transports = ["akka.remote.netty.tcp"]
      |    netty.tcp {
      |      hostname = "0.0.0.0"
      |      port = 2552
      |    }
      |  }
      |}
    """.stripMargin

Мои предположения заключаются в том, что в коде я определяю только одно развертывание, поэтому пример не работает должным образом. Итак, как мы можем определить несколько развертываний?

0 ответов

Другие вопросы по тегам