我尝试移植从Scala角色向Akka角色发送"Ping“和"Pong”的this simple actor example,但我一直收到错误,我想知道这只是一个简单的错误还是一些根本的错误。
考虑下面的代码:
import akka.actor.Actor._
import akka.actor.Actor
case class Message(text: String)
class PingPongActor(name: String) extends Actor {
def receive = {
case Message(msg) =>
println("received: " + msg)
Thread.sleep(1000)
self.reply(Message("Ping"))
case None => println("ping: timed out!")
}
}
object Ping extends App {
remote.start("localhost", 2552)
.register("ping-service", actorOf(new PingPongActor("pong")))
val actor = remote.actorFor("ping-service", "localhost", 2552)
actor ! (Message("Ping"))
}
object Pong extends App {
remote.start("localhost", 2553)
.register("pong-service", actorOf(new PingPongActor("ping")))
val actor = remote.actorFor("pong-service", "localhost", 2553)
actor ! (Message("Pong"))
}我一直收到这个错误:
received: Ping
[GENERIC] [07.10.11 23:18] [RemoteServerStarted(akka.remote.netty.NettyRemoteSupport@3ff2cea2)]
[ERROR] [07.10.11 23:18] [akka:event-driven:dispatcher:global-2] [LocalActorRef]
No sender in scope, can't reply.
You have probably:
1. Sent a message to an Actor from an instance that is NOT an Actor.
2. Invoked a method on an TypedActor from an instance NOT an TypedActor.
You may want to have a look at safe_! for a variant returning a Boolean
akka.actor.IllegalActorStateException:
No sender in scope, can't reply.
You have probably:
1. Sent a message to an Actor from an instance that is NOT an Actor.
2. Invoked a method on an TypedActor from an instance NOT an TypedActor.
You may want to have a look at safe_! for a variant returning a Boolean
[laptop_e3263500-f129-11e0-a78d-001636ff8076]
at akka.actor.NullChannel$.$bang(Channel.scala:177)
at akka.actor.ActorRef$class.reply(ActorRef.scala:398)
at akka.actor.LocalActorRef.reply(ActorRef.scala:605)
at PingPongActor$$anonfun$receive$1.apply(RemoteActor.scala:21)
at PingPongActor$$anonfun$receive$1.apply(RemoteActor.scala:15)
at akka.actor.Actor$class.apply(Actor.scala:545)
at PingPongActor.apply(RemoteActor.scala:13)我的想法是启动两个应用程序,Ping和Pong,这两个应用程序尝试每秒发送一条消息并在终端上打印(如果两秒钟内没有收到消息,则打印一条错误消息)。
发布于 2011-10-08 14:23:32
您的代码最大的基本问题是,您从参与者外部发送消息,因此响应无处可去。您会注意到,在原始示例中,初始Message("ping")是从Ping执行元的act()循环中发送的。但实际上你有几个问题,最好从头开始,稍微重组一下代码。下面是一个有效的示例,但它依赖于以特定的顺序启动客户端。当然,您可以重写此代码,以保持从PingActor重试连接。
sealed trait Message
case class Ping extends Message
case class Pong extends Message
class PingActor extends Actor {
override def preStart = {
val pong = remote.actorFor("pong-service", "localhost", 2553)
pong ! Ping
}
def receive = {
case Pong => {
println("Received pong")
Thread.sleep(1000)
self.reply(Ping)
}
}
}
class PongActor extends Actor {
def receive = {
case Ping => {
println("Received ping")
Thread.sleep(1000)
self.reply(Pong)
}
}
}
object pingApp extends App {
val actor = actorOf(new PingActor)
remote.start("localhost", 2552)
.register("ping-service", actor)
}
object pongApp extends App {
val actor = actorOf(new PongActor)
remote.start("localhost", 2553)
.register("pong-service", actor)
}https://stackoverflow.com/questions/7693025
复制相似问题