2013-04-11 52 views
3

我有一个Play 2.1应用程序,当我有错误的数据库url时,它无法启动。问题是,错误信息不是很好。当Play 2.1在启动时崩溃时如何进行错误日志记录

[error] c.j.b.h.AbstractConnectionHook - Failed to obtain initial connection Sleeping for 0ms and trying again. A ttempts left: 0. Exception: null 
Oops, cannot start the server. 
Configuration error: Configuration error[Cannot connect to database [default]] 
    at play.api.Configuration$.play$api$Configuration$$configError(Configuration.scala:74) 
    at play.api.Configuration.reportError(Configuration.scala:552) 
    at play.api.db.BoneCPPlugin$$anonfun$onStart$1.apply(DB.scala:248) 
    at play.api.db.BoneCPPlugin$$anonfun$onStart$1.apply(DB.scala:239) 
.... 

我想服务器转储它试图在这种情况下使用的数据库url。当启动过程中出现异常时,Play 2.1是否提供任何钩子来执行代码?

回答

2

在Play Framework 2中,您可以通过扩展GlobalSettings来覆盖生命周期的某些阶段。具体而言,onLoadConfig在配置解析和数据库连接建立之前被调用。

下面是一个拦截错误的例子(哈克)。您可以创建一个Application的假实例,然后将其传递给Configuration对象。然后,您可以使用它创建BoneCPPlugin的实例并尝试创建连接。如果数据库无法访问,您可以在catch块中拦截该数据库。

import java.io.File 
import play.api._ 
import play.api.db.BoneCPPlugin 
import scala.util.control.NonFatal 

object Global extends GlobalSettings { 
    override def onLoadConfig(config: Configuration, path: File, classloader: ClassLoader, mode: Mode.Mode) = { 
    val app = new DefaultApplication(path, classloader, None, mode){ 
     override lazy val configuration = config 
    } 
    try { 
     new BoneCPPlugin(app).onStart() 
    } catch { 
     case e: PlayException => 
      // handle 
     case _ => // other types of errors that we don't care about here 
    } 
    super.onLoadConfig(config, path, classloader, mode) 
    } 
} 
+0

使用这种方法,您在启动实际应用程序之前“测试启动”应用程序和数据库连接池,是吗?在上车之前踢轮胎的种类?看起来像很多额外的处理,但我想这只是在启动。 – 2013-07-05 17:37:51