播放Iteratees:简单文件迭代的错误

时间:2013-05-31 12:47:36

标签: scala playframework-2.0 iterate

我目前正试图围绕EnumeratorsIteratees的想法。我决定首先看看Play 2.0的iteratee库,我已经将 build.sbt 文件中的以下行添加到我的测试项目中。 (我使用的是Scala 2.10)(docs here

resolvers += "Typesafe repository" at 
  "http://repo.typesafe.com/typesafe/releases/"

libraryDependencies += "play" %% "play-iteratees" % "2.1.1"

我的目标是在文件的字节上创建一个Enumerator,并最终为它添加一些解析逻辑,但是当我尝试看似简单的事情时,我得到一个例外。 我的代码如下所示:

val instr = getClass.getResourceAsStream(...)
val streamBytes = for {
  chunk <- Enumerator fromStream instr
  byte <- Enumerator enumerate chunk
} yield byte

val printer = Iteratee.foreach[Byte](println)

streamBytes.apply(printer)

会发生什么(我假设是)文件中的所有字节都打印出来,然后我得到IllegalStateException说“承诺已经完成”。

java.lang.IllegalStateException: Promise already completed.
    at scala.concurrent.Promise$class.complete(Promise.scala:55)
    at scala.concurrent.impl.Promise$DefaultPromise.complete(Promise.scala:58)
    at scala.concurrent.Promise$class.failure(Promise.scala:107)
    at scala.concurrent.impl.Promise$DefaultPromise.failure(Promise.scala:58)
    at scala.concurrent.Future$$anonfun$flatMap$1.liftedTree3$1(Future.scala:283)
    at scala.concurrent.Future$$anonfun$flatMap$1.apply(Future.scala:277)
    at scala.concurrent.Future$$anonfun$flatMap$1.apply(Future.scala:274)
    at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:29)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)

由于堆栈跟踪没有指向我的代码中的任何地方,这是一个不熟悉的领域,我不知道出了什么问题。任何人都可以为这个问题提供一些见解或解决方案吗?

1 个答案:

答案 0 :(得分:1)

看看这是否适合您。我的代码也遇到异常,但是当我解开你的for-comp时,事情就有效了。我不是百分之百确定为什么,因为我认为for-comp无论如何都不顾这个代码,但我必须遗漏一些东西:

val bytes = Enumerator fromStream instr flatMap (Enumerator enumerate _)    
val printer = Iteratee.foreach[Byte](b => println(b))    
bytes |>> printer