【问题标题】:Akka and java.nio. Non-blocking selectorAkka 和 java.nio。非阻塞选择器
【发布时间】:2014-03-08 03:52:12
【问题描述】:

我正在尝试编写侦听 tcp 连接的服务器。 我正在使用 nonblockig java.nio。

当演员收到“STARTLISTEN”消息时我的 selector.select() 启动,这没关系,但是当我向演员发送消息时,它不会收到消息,直到选择器没有收到任何数据。

如何避免这种情况?例如,我想向我的演员发送消息“停止”以停止选择? 只有用 timeout 或 selectNow() 调用 select 的方法吗?

我不会使用 akka.io。

这不是完整的代码,但它说明了问题:

class MyActor(val host: String, port: Int) extends Actor {

  val serverChannel = ServerSocketChannel.open()    
  val channelSelector = Selector.open()

  serverChannel.configureBlocking(false);       
  serverChannel.bind(new InetSocketAddress( InetAddress.getByName(host), port ))

  serverChannel.register(channelSelector, SelectionKey.OP_ACCEPT);                  

  override def receive = {
      case "STARTLISTEN" => {
         val keys = channelSelector.select()           
         // processing read write etc....
      }
      case "STOP" => {
         // I want to stop selection here....
      }
  }
}

【问题讨论】:

  • 很不清楚,你应该分享你的代码的相关sn-ps。

标签: scala akka nio


【解决方案1】:

即使您立即忽略它,我还是想指出(记录在案),使用经过验证的实现 ships with Akka already 可能是更好的方法。 (我链接到 2.3.0-RC2 文档是因为 2.2.x 系列中引入的一些实验性功能将不再是 Akka 的一部分——适者生存。)

【讨论】:

    【解决方案2】:

    您可以通过将您的演员分成多个演员来实现这一点。第一个参与者接收来自外部的消息,第二个阻止 select()。第一个参与者可以使用wakeup() 阻止第二个参与者在发送任何消息之前阻止它。

    【讨论】:

    • 你的意思是这样的吗: case "STARTLISTEN" => { blockingRef = context.actorFor(PropsclassOf[MyBlockingActor], channelSelector ) } case "STOP" => { blockingRef.wakeup() }
    猜你喜欢
    • 1970-01-01
    • 2015-05-15
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    • 2020-10-30
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    相关资源
    最近更新 更多