Akka和java.nio。非阻塞选择器

时间:2014-02-10 17:10:46

标签: scala akka nio

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

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

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

我不会使用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....
      }
  }
}

2 个答案:

答案 0 :(得分:1)

即使你不加思索地解雇它,我也想指出(记录在案)使用经过验证的实现,ships with Akka already可能是更好的方法。 (我正在链接到2.3.0-RC2文档,因为2.2.x系列中引入的一些实验性功能将不会成为Akka前进的一部分 - 适者生存。)

答案 1 :(得分:0)

您可以通过将演员分成多个演员来实现这一目标。第一个actor从外部接收消息,第二个块在select()上接收消息。第一个参与者可以使用wakeup()阻止第二个阻止,然后再发送任何消息。