回線 A を無効にすると、HelloRemote アプリは「hello world」というメッセージを受信できません。ローカルのアクター システムをあまりにも早くシャットダウンすると、メッセージがリモートに送信されないようです。
もちろん、ローカルのアクターは、リモートからのメッセージを待ってメッセージが既に受信されていることを確認することもできますが、そのようなコードを追加すると、プロセスは同期的になり、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://HelloRemoteSystem@127.0.0.1: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
}