首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用不带future/ask的RemoteActors

使用不带future/ask的RemoteActors
EN

Stack Overflow用户
提问于 2011-11-10 01:43:51
回答 1查看 434关注 0票数 0

我想从客户端的执行元异步发送一条消息(!)并从服务器向Actor返回一条消息。关键是我不想使用(?)并获得未来。

我有以下示例代码:

代码语言:javascript
复制
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))
  }

}

此代码失败,跟踪如下:

代码语言:javascript
复制
[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)

这似乎是可以做到的。是吗?

EN

回答 1

Stack Overflow用户

发布于 2012-01-02 23:25:18

这是一个老问题,Viktor已经回答了这个问题,但是我不喜欢“无答案”状态,所以为了完整起见: main方法应该改为

代码语言:javascript
复制
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“)访问,因为应答将通过该远程主机发起的新连接发送。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8069200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档