Scala中的非阻塞读取没有框架

时间:2016-08-13 07:30:01

标签: java scala netty nonblocking

使用标准java java.io.DataInputStream,可以读取异构二进制数据,如:

  val stream = new DataInputStream(???)
  val i = stream.readInt()

  if (i > 5) {
    val string = stream.readUTF()
    ???
  } else {
    val long = stream.readLong()
    ???
  }

没关系,它会消耗整个线程,因此在高负载服务器中无用。

是否有可能为Scala找到/制作一些看起来像这样但是非阻塞的API?

当然有一个Netty的ByteBuf,但它们需要像LengthFieldBasedFrameDecoder这样的框架,以确保在我开始阅读之前已经收到所有数据,而在我的情况下,传入的数据包不会包括长度,因此在完全解析之前不可能知道数据包的长度。这种情况确实存在ReplayingDecoder,但它的表现并不是很有希望。

解决方案我正在考虑将Netty处理程序包装成:

  trait NonBlockingReader {

    def readInt: Future[Int]

    def readUTF: Future[String]

    def readLong: Future[Long]

    //...

  }

然后它可以像:

一样使用
  val source: NonBlockingReader = ???

  val someResult: Future[Any] = for (
    i <- source.readInt;
    r <- if (i > 6) source.readUTF else source.readLong
  ) yield r

这是方便,好看,不需要框架,但我想知道这不是一个开销,我不是重新发明轮子?

1 个答案:

答案 0 :(得分:0)

Scala不为非阻塞文件IO提供显式API,但普通Java API在这些情况下使用是正确的。您应该考虑使用java.nio.channels.AsynchronousFileChannel或Java NIO Api。