使用play框架在scala中的Actors中出现奇怪的NullPointerException

时间:2011-07-25 13:30:35

标签: java scala playframework parallel-processing actor

我想做一些并行计算,我在调用我所拥有的对象之外的任何函数时遇到一个非常奇怪的java.lang.NullPointerException。

看看:

case class Return(session: String, job: Int)
case class Ready(n: Int)
case class DoJob(session: String, job: Int)
case class NotReady


object Notifications extends Controller with Secure {

  class AtorMeio extends Actor {
    import scala.collection.mutable.{Map => MMap}
    val job: MMap[(String, Int), Option[Int]] = MMap()

    def act {
      loop {
        react {
          case DoJob(session, jobn) =>
            if (job.get((session, jobn)).isEmpty) {
              jobn match {
                case 1 =>
                  job.put((session, jobn), None)

                    val n = Messaging.oi //Messaging.retrieveNumberOfMessages(new FlagTerm(new Flags(Flags.Flag.SEEN), false))
                    job.put((session, jobn), Some(n))

                case 2 =>
                  // do!
              }
            }
          case Return(session, jobn) =>
            if (job.get((session, jobn)).isDefined && job.get((session, jobn)).get.isDefined) {
              val ret = job.get((session, jobn)).get.get
              job.remove((session, jobn))

              reply(Ready(ret))
            }
            else
              reply(NotReady)
        }
      }
    }
  }

  private var meuator: AtorMeio = null
  lazy val ator = {
    if (Option(meuator).isEmpty) {
      meuator = new AtorMeio
      meuator.start
    }

    meuator
  }

  def pendingNotifications = {    
    ator ! DoJob(session.getId, 1)

    ator !? Return(session.getId, 1) match {
      case Ready(ret) =>
        if (ret.toString != Option[String](params.get("current")).getOrElse("-1")) "true" else Suspend("80s")
      case _ =>
    }
  }
}

我在执行Messaging.oi时遇到错误,它基本上是一个对象:

def oi = 4

这是stacktrace:

controllers.Notifications$AtorMeio@1889d53: caught java.lang.NullPointerException
java.lang.NullPointerException
    at controllers.Messaging$.oi(Messaging.scala:108)
    at     controllers.Notifications$AtorMeio$$anonfun$act$1$$anonfun$apply$1.apply(Notifications.scala:38)
at controllers.Notifications$AtorMeio$$anonfun$act$1$$anonfun$apply$1.apply(Notifications.scala:31) at scala.actors.ReactorTask.run(ReactorTask.scala:34)
at scala.actors.ReactorTask.compute(ReactorTask.scala:66)
at scala.concurrent.forkjoin.RecursiveAction.exec(RecursiveAction.java:147)
at scala.concurrent.forkjoin.ForkJoinTask.quietlyExec(ForkJoinTask.java:422)
at scala.concurrent.forkjoin.ForkJoinWorkerThread.mainLoop(ForkJoinWorkerThread.java:340)
at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:325)

第108行就是这个oneliner def。啊,入口点是def pendingNotifications。

任何人都可以提供帮助?非常感谢!

3 个答案:

答案 0 :(得分:1)

您是否尝试过更换

 private var meuator: AtorMeio = null 

通过:

private var meuator: AtorMeio = None 

答案 1 :(得分:0)

在调试器中配置断点视图以暂停/中断NullPointerExceptions ...

并且:你确实看到你在这里将其设置为null:

  private var meuator: AtorMeio = null 

??或?

答案 2 :(得分:0)

好的人,在挖掘了很多之后我发现了这个问题:不知何故,如果你把Play框架中的“Controller”类混入其中,它会崩溃地崩溃。所以我把这个东西包装成一个“干净”的类,它起作用了。