私のプロジェクトには 2 つの部分が含まれています。1 つは akka server で、もう 1 つは play フレームワークです。どちらも時々再起動できます。akkaサーバーからログを受信するために、Websocketハンドラーを使用しています
def ws = WebSocket.acceptWithActor[JsValue, JsValue] { request => out =>
CheckerActor.props(out)
}
一部のリモート アクターの変更をサブスクライブするアクターと。
class CheckerActor(out: ActorRef) extends Actor {
...
override def preStart() = {
context.actorSelection("akka.tcp://Sys@127.0.0.1:2553/user/logger") ! Subscribe()
}
override def postStop() {
context.actorSelection("akka.tcp://Sys@127.0.0.1:2553/user/logger") ! Unsubscribe()
}
def receive = {
case msg: LogMessage => out ! Json.toJson(msg)
...
}
}
リモート ロガー アクターは、subscribe() unsubscribe() イベントに反応し、サブスクライブしたクライアントにログ メッセージを送信します。リモートサーバーがハングアップしないか、再起動するまでは正常に動作します。リモート akka サーバーが接続を切断したことを検出する最も安価な方法は何ですか (その後、新しく開始したロガーに再度サブスクリプションを作成できます)。ピンガーアクターを構築できます。タイムアウトを受け取った場合は、再サブスクリプションを再度試みますが、単純なpingでは、それらの間で再起動が発生したことを保証できず、システムがより複雑になります。他の解決策が存在する可能性があります。