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
Мои предположения заключаются в том, что в коде я определяю только одно развертывание, поэтому пример не работает должным образом. Итак, как мы можем определить несколько развертываний?