Play framework + Scala でリクエストが返らずに嵌った

環境

  • Play framework 1.2.4
  • Scala Module 0.9.1 (Scala 2.8.1)

ある時を境にどのURLにリクエストを投げても、
ずっと読み込み中のままいつまでたってもレスポンスがかえってこなくなった。

ログを見ても以下で止ったままで何も出力されない。

...

Traversing /home/kiris/project/sample1/tmp/generated/views.defaults.html.welcome.scala
Traversing /home/kiris/project/sample1/tmp/generated/views.html.main.scala
API phase took : 1.759 s

原因がさっぱりわからないのでThread Dumpだしてみた。

% jps
19264 Jps
18730 Server

% jstac 18730
"Thread-3" prio=10 tid=0x00007fe8d87ff000 nid=0x6ba9 waiting for monitor entry [0x00007fe8dc3d7000]
   java.lang.Thread.State: BLOCKED (on object monitor)
	at sbt.BufferedLogger.doBufferableIf(BufferedLogger.scala:87)
	- waiting to lock <0x00000000f6ec6e78> (a sbt.Logger$$anon$1)
	at sbt.BufferedLogger.doBufferable(BufferedLogger.scala:85)
	at sbt.BufferedLogger.log(BufferedLogger.scala:75)
	at sbt.Logger$class.error(Logger.scala:74)
	at sbt.AbstractLogger.error(Logger.scala:8)
	at sbt.BasicIO$$anonfun$processErrFully$1.apply(ProcessImpl.scala:51)
	at sbt.BasicIO$$anonfun$processErrFully$1.apply(ProcessImpl.scala:51)
	at sbt.BasicIO$.readFully$1(ProcessImpl.scala:73)
    ...

どうもsbtからエラーログを出力する所で止ってしまっているっぽい。
出力しようとしている文字列がわかれば原因が特定できそうなので、
Eclipse PluginのMemory Analyzer(http://eclipse.org/mat/)を使ってヒープ解析。

f:id:kiris60:20120124131221p:plain
Thread-3で検索かけて調べてみると、どうもJPAとAnorm共存させていたせいか、
JPA側のアノテーションプロセッサの処理でコケてたっぽい。怪しい行を削除したら動いた。

まとめ

  • PlayでEnsimeのデバッガーを動かせるようしておくべき
  • あけましておめでとう