在Play 2.2中调试Futures和Iteratees

时间:2013-10-24 18:24:46

标签: scala playframework playframework-2.2

我的Play 2.2应用程序中有一些奇怪的行为,我不知道如何调试它。我的代码运行正常,直到我开始使用iteratees。

我的演员创建​​一个类似下面的枚举器并将其发送回调用者:

val emailFeed = Concurrent.unicast[Message] (
          onStart = {
            pushee => {
              log.debug("Pushing 1")
              pushee.push(messages.apply(0))
              log.debug("Pushed 1")

            }
            },
          onComplete = {
            log.debug("Done with pushee")
          },
          onError = {
            (msg, in) => log.error(msg)
          }
然后,呼叫者通过以下方式消费它:

f.map { reply =>
        val emailFeed = reply.asInstanceOf[Enumerator[Message]]
        val iter =  Iteratee.fold[Message,String] ("") {
          (result, msg) =>   {
             Logger.debug("appending subj")
             result ++ msg.getSubject()
             Logger.debug(" subj appended")
             result
          }
        }
        val result: Future[String] = emailFeed |>>> iter
        Await.result(result, 10 minutes)

问题是Await.result超时。我已经逐步完成了iteratee代码,看到它被调用了。只有一个块可以处理,所以它很快。我还在控制台中看到了枚举器和iteratee调试stmts。我只是不知道它为什么没有完成:

[debug] application - Pushing 1
[debug] application - Pushed 1
[debug] application - appending subj
[debug] application -  subj appended

1 个答案:

答案 0 :(得分:2)

显然,如果您忘记正确结束调查员,Play中没有太多反馈。你必须致电:

pushee.end

pushee.eofAndEnd

触发枚举器关闭,Future完成。