1
votes

I'm having some strange behavior in my Play 2.2 app and I'm not sure how to go about debugging it. My code was running fine until I started using iteratees.

My actor creates an enumerator like below and sends it back to the caller:

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)
          }

the caller then consumes it by :

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)

The problem is Await.result times out. I have stepped through the iteratee code and see it being called. There is only 1 chunk to process so it is quick. I also see the enumerator and iteratee debug stmts in the console. I just don't know why it doesn't complete:

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

1 Answers

2
votes

Apparently, there isn't much feedback in Play if you forget to end your enumerator properly. You must call:

pushee.end

or

pushee.eofAndEnd

to trigger the enumerator to close and the Future to complete.