Если я отключу строку A, приложение HelloRemote не сможет получить сообщение «привет мир», похоже, если мы выключим локальную актерскую систему слишком быстро, сообщение не будет отправлено на удаленный?Что предлагает способ отключения удаленного клиента akka
Конечно, местный актер мог ждать сообщения от пульта, чтобы подтвердить уже полученное сообщение, но если мы добавим такой код, процесс будет синхронным, я не хочу, чтобы вещь стала чем-то вроде RPC.
Я просто хочу сделать его асинхронным, а также не хочу тратить время на «Thread.sleep (3000)», я хочу, чтобы клиент закрыл как можно скорее, какое-либо предложение?
HelloRemote.scala
package remote
import akka.actor._
object HelloRemote extends App {
val system = ActorSystem("HelloRemoteSystem")
val remoteActor = system.actorOf(Props[RemoteActor], name = "RemoteActor")
}
class RemoteActor extends Actor {
def receive = {
case msg: String =>
println(s"received message '$msg'")
}
}
Local.scala
package local
import akka.actor._
object Local extends App {
val system = ActorSystem("LocalSystem")
val localActor = system.actorOf(Props[LocalActor], name = "LocalActor")
localActor ! "START"
}
class LocalActor extends Actor {
val remote = context.actorSelection(
"akka.tcp://[email protected]:5150/user/RemoteActor")
def receive = {
case "START" =>
remote ! "hello world"
Thread.sleep(3000) // Line A
context.stop(self)
context.system.shutdown
}
}
Кроме того, паста application.conf для легкой попытки.
отдаленная часть:
akka {
actor {
provider = "akka.remote.RemoteActorRefProvider"
}
remote {
netty.tcp {
hostname = "127.0.0.1"
port = 5150
}
log-remote-lifecycle-events = off
}
log-dead-letters = off
log-dead-letters-during-shutdown = off
}
локальная часть:
akka {
actor {
provider = "akka.remote.RemoteActorRefProvider"
}
remote {
log-remote-lifecycle-events = off
}
log-dead-letters = off
log-dead-letters-during-shutdown = off
}
Вместо 'context.stop (само)', вы можете отправить сообщение 'PoisonPill' для себя, удалить линии А и при получении' PoisonPill' сообщение вы могли бы выключить систему – curious
@ curious, интересно, как я могу сделать свое действие после себя! PoisonPill, похоже, akka справится с этим сообщением сам по себе, поэтому что-то вроде следующего не работает. case PoisonPill => println («wow») – lagom
Исправить, создать «случайный объект» для пользовательского сообщения типа «KillLocal» и отправить его «самому» и после получения «KillLocal» do 'context.stop (self)'; 'context.system.shutdown' – curious