Использование RemoteActors без будущего /ask
Я хотел бы отправить сообщение от Actor на клиентской стороне асинхронно (!) И вернуть сообщение Actor с сервера. Ключ в том, что я не хочу использовать (?) И получить будущее.
У меня есть следующий пример кода:
import akka.actor.Actor._
import akka.event.EventHandler
import akka.actor.{ActorRef, Actor}
case class FromUser(s: String)
case class FromServer(s: String)
class ServerActor extends Actor {
protected def receive = {
case FromUser(msg) => self.sender ! FromServer(msg)
}
}
class ClientActor(val remoteServer: ActorRef) extends Actor {
protected def receive = {
case FromUser(msg) => {
EventHandler.info(this, "I got '" + msg + "' from the user.")
remoteServer ! FromUser(msg)
}
case FromServer(msg) => EventHandler.info(this, "I got '" + msg + "' from the server.")
}
}
object Client {
def main(args: Array[String]) {
val s = Actor.remote.actorFor("ServerActor", "NYCWD2328", 4552)
val c = Actor.actorOf(new ClientActor(s)).start
c ! FromUser("Hello")
}
}
object Server {
def main(args: Array[String]) {
Actor.remote.start("NYCWD2328", 4552)
Actor.remote.register("ServerActor", actorOf(new ServerActor))
}
}
Этот код завершается ошибкой со следующей трассировкой:
[GENERIC] [11/9/11 12:32 PM] [RemoteClientWriteFailed(uuid {
high: 15711794799146701281
low: 10512246108465469656
}
actorInfo {
....
timeout: 5000
}
,java.nio.channels.ClosedChannelException,akka.remote.netty.NettyRemoteSupport@a1d1f4,/127.0.0.1:2552)]
[GENERIC] [11/9/11 12:32 PM] [RemoteClientError(java.nio.channels.ClosedChannelException,akka.remote.netty.NettyRemoteSupport@a1d1f4,/127.0.0.1:2552)]
[ERROR] [11/9/11 12:32 PM] [akka:event-driven:dispatcher:global-3] [LocalActorRef] null
java.nio.channels.ClosedChannelException
at org.jboss.netty.channel.socket.nio.NioWorker.cleanUpWriteBuffer(NioWorker.java:643)
Кажется, это должно быть возможно сделать. Это?
1 ответ
Это старый вопрос, и Виктор уже ответил на него, но мне не нравится состояние "нет ответа", поэтому для полноты: основной метод должен быть изменен на
object Client {
def main(args: Array[String]) {
// choose available port on local machine
Actor.remote.start("YourHostnameHere", 4553)
val s = Actor.remote.actorFor("ServerActor", "NYCWD2328", 4552)
val c = Actor.actorOf(new ClientActor(s)).start
c ! FromUser("Hello")
}
}
Запущенная удаленная служба (хост и порт) должна быть доступна с удаленного компьютера, здесь "NYCWD2328", поскольку ответы будут отправляться через новое соединение, инициированное этим удаленным хостом.