0

回線 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
    }
4

1 に答える 1

0

最も単純なこととして、リモート アクターはポイズン ピルをローカル クライアントに送り返すことができます。

このような:

sender ! Kill

ここで読むことができますhttp://doc.akka.io/docs/akka/snapshot/scala/actors.html#Killing_an_Actor

または、自分自身を停止する前にローカル アクターに何かを行うように指示する「秘密の」メッセージを選択することもできます。

短い例。遠隔部:

class RemoteActor extends Actor {
  def receive = {
     case msg: String =>
               println(s"received message '$msg'")
               sender ! "secretWord"
  }     
}

ローカル部分:

 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"
      case "secretWord" =>
      context.stop()
  }

  def postStop(): Unit = { 
     //do something here
  }
}
于 2016-06-07T08:39:19.423 に答える