我在学习有关Akka 2.1中的远程演员,并试图修改counter example provided by Typesafe。 我从控制台实现了一个quick'n'dirty UI来发送滴答。并要求(并显示结果)当前计数退出。Akka 2.1远程:跨系统共享演员
这个想法是启动一个主节点,它将运行Counter actor和某个客户端节点,该节点将通过远程处理向其发送消息。不过,我想通过配置和代码的最小改变来实现这一点。所以通过改变配置可以使用本地角色。
我发现this blog entry关于类似的问题,即所有的API调用都需要经过一个actor,即使有很多实例在运行。
我写了类似的配置,但我不能让它工作。我当前的代码确实使用了远程处理,但是它为每个新节点在主节点上创建了一个新的actor,并且我无法在未明确给出路径(并且违反配置点)的情况下连接到现有的actor。然而这不是我想要的,因为这种方式不能在JVM之间共享状态。可through a git repo
完全可运行代码这是我的配置文件
akka {
actor {
provider = "akka.remote.RemoteActorRefProvider"
deployment {
/counter {
remote = "akka://[email protected]: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
而在另一个窗口sbt run -Dakka.remote.netty.port=0
运行它。
修复了代码。更改参数不会改变行为。它有效,但不是我想要的方式。为了重述我的问题:如何(如果可能)配置akka不是为每个客户创建新的演员,而是分享现有的演员? – edofic 2013-02-11 11:11:50