Scala 播放迭代对象:简单文件迭代错误
目前,我正试图将注意力集中在Scala 播放迭代对象:简单文件迭代错误,scala,playframework-2.0,iterate,Scala,Playframework 2.0,Iterate,目前,我正试图将注意力集中在枚举数和迭代对象上。我决定从Play2.0的iteratee库开始,我已经在build.sbt文件中将它添加到了我的测试项目中。(我正在使用Scala 2.10)() 我的目标是在文件的字节上创建一个枚举器,并最终为其附加一些解析逻辑,但当我尝试看似简单的方法时,我会遇到一个异常。 我的代码如下所示: val instr = getClass.getResourceAsStream(...) val streamBytes = for { chunk <-
枚举数
和迭代对象
上。我决定从Play2.0的iteratee库开始,我已经在build.sbt文件中将它添加到了我的测试项目中。(我正在使用Scala 2.10)()
我的目标是在文件的字节上创建一个枚举器,并最终为其附加一些解析逻辑,但当我尝试看似简单的方法时,我会遇到一个异常。
我的代码如下所示:
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)
由于堆栈跟踪没有指向代码中的任何地方,而且这是一个不熟悉的领域,所以我不知道出了什么问题。有人能为这个问题提供一些见解或解决方案吗?看看这是否适合你。我也收到了你的代码异常,但当我解开你的comp时,一切都正常了。我不能100%确定原因,因为我认为for comp无论如何都与此代码有关,但我肯定遗漏了一些东西:
val bytes = Enumerator fromStream instr flatMap (Enumerator enumerate _)
val printer = Iteratee.foreach[Byte](b => println(b))
bytes |>> printer
这很奇怪。。。我再次尝试了同样的事情(这次是在工作中),但它不是一个例外,而是在打印完成后永远挂起。即使使用了您提供的代码,它也会挂起。稍后(工作结束后)我将再次尝试此操作,然后再与您联系。我有一些停机时间,发现我最近的尝试被挂起,因为有一个内部
ExecutionContext
正在使用,而不是我真正想要的,它正在创建非守护进程线程。这看起来像是在玩虫子,不是吗?同意。枚举
需要隐式的执行上下文
。当我给它一个,然后在打印完成后关闭该上下文时,我的服务器仍然保持运行,这不是我所期望的。当然需要进一步调查。如果在jconsole中调出它,您会看到一个名为iteratee-execution-context的线程池。看起来它正在工作中:我将这个答案标记为已接受,因为它提供了一些有用的信息。
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)
val bytes = Enumerator fromStream instr flatMap (Enumerator enumerate _)
val printer = Iteratee.foreach[Byte](b => println(b))
bytes |>> printer