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

Scala Akka和java.nio。非阻塞选择器,scala,akka,nio,Scala,Akka,Nio,我正在尝试编写侦听tcp连接的服务器。 我使用的是非blockig java.nio 我的selector.select()在actor接收到“STARTLISTEN”消息时启动,但当我向actor发送消息时,它不会接收消息,直到选择器没有收到任何数据 如何避免这种情况?例如,我想向我的演员发送消息“停止”以停止选择? 是否只有通过超时调用select或selectNow()的方法 我不会用akka.io 这不是完整的代码,但它说明了问题: class MyActor(val host: Str

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

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

如何避免这种情况?例如,我想向我的演员发送消息“停止”以停止选择? 是否只有通过超时调用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....
      }
  }
}

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

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

非常不清楚,您应该分享代码的相关片段。您的意思是这样的:case“STARTLISTEN”=>{blockingRef=context.actor(PropsclassOf[MyBlockingActor],channelSelector)}case“STOP”=>{blockingRef.wakeup()}