私は Akka 2.1 のリモート アクターについて学んでおり、Typesafe が提供する反例を適応させようとしました。ティックを送信するために、コンソールからクイックアンドダーティ UI を実装しました。そして、現在のカウントを尋ねて(そして結果を表示して)終了します。
アイデアは、Counter アクターを実行するマスター ノードと、リモーティングを通じてそれにメッセージを送信するクライアント ノードを開始することです。ただし、構成とコードへの最小限の変更によってこれを実現したいと考えています。そのため、構成を変更することで、ローカル アクターを使用できます。
多くのインスタンスが実行されているにもかかわらず、すべての API 呼び出しが 1 つのアクターを経由する必要があるという同様の問題に関するこのブログ エントリを見つけました。
同様の構成を書きましたが、動作させることができません。私の現在のコードはリモーティングを使用していますが、新しいノードごとにマスターに新しいアクターを作成し、パスを明示的に指定しないと (そして構成のポイントに逆らいます)、既存のアクターに接続することはできません。ただし、この方法では JVM 間で状態を共有できないため、これは私が望むものではありません。
git リポジトリから利用可能な完全な実行可能なコード
これは私の設定ファイルです
akka {
actor {
provider = "akka.remote.RemoteActorRefProvider"
deployment {
/counter {
remote = "akka://ticker@127.0.0.1:2552"
}
}
}
remote {
transport = "akka.remote.netty.NettyRemoteTransport"
log-sent-messages = on
netty {
hostname = "127.0.0.1"
}
}
}
そしてフルソース
import akka.actor._
import akka.pattern.ask
import scala.concurrent.duration._
import akka.util.Timeout
import scala.util._
case object Tick
case object Get
class Counter extends Actor {
var count = 0
val id = math.random.toString.substring(2)
println(s"\nmy name is $id\ni'm at ${self.path}\n")
def log(s: String) = println(s"$id: $s")
def receive = {
case Tick =>
count += 1
log(s"got a tick, now at $count")
case Get =>
sender ! count
log(s"asked for count, replied with $count")
}
}
object AkkaProjectInScala extends App {
val system = ActorSystem("ticker")
implicit val ec = system.dispatcher
val counter = system.actorOf(Props[Counter], "counter")
def step {
print("tick or quit? ")
readLine() match {
case "tick" => counter ! Tick
case "quit" => return
case _ =>
}
step
}
step
implicit val timeout = Timeout(5.seconds)
val f = counter ? Get
f onComplete {
case Failure(e) => throw e
case Success(count) => println("Count is " + count)
}
system.shutdown()
}
sbt run
別のウィンドウで andを使用sbt run -Dakka.remote.netty.port=0
して実行しました。