Play framework + Scala でリクエストが返らずに嵌った
環境
ある時を境にどの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/)を使ってヒープ解析。
Thread-3で検索かけて調べてみると、どうもJPAとAnorm共存させていたせいか、
JPA側のアノテーションプロセッサの処理でコケてたっぽい。怪しい行を削除したら動いた。
まとめ
- PlayでEnsimeのデバッガーを動かせるようしておくべき
- あけましておめでとう