Author: rhirsch
Date: Mon May  3 09:20:23 2010
New Revision: 940403

URL: http://svn.apache.org/viewvc?rev=940403&view=rev
Log:
[ESME-155] DB Problems during Tomcat shutdown

Modified:
    incubator/esme/trunk/server/src/main/scala/bootstrap/liftweb/Boot.scala

Modified: 
incubator/esme/trunk/server/src/main/scala/bootstrap/liftweb/Boot.scala
URL: 
http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/scala/bootstrap/liftweb/Boot.scala?rev=940403&r1=940402&r2=940403&view=diff
==============================================================================
--- incubator/esme/trunk/server/src/main/scala/bootstrap/liftweb/Boot.scala 
(original)
+++ incubator/esme/trunk/server/src/main/scala/bootstrap/liftweb/Boot.scala Mon 
May  3 09:20:23 2010
@@ -29,8 +29,9 @@ import net.liftweb.sitemap.Loc._
 import Helpers._
 import TimeHelpers.intToTimeSpanBuilder
 import TimeHelpers.timeSpanToLong
-import net.liftweb.mapper.{DB, ConnectionManager, Schemifier, 
DefaultConnectionIdentifier, ConnectionIdentifier}
+//import net.liftweb.mapper.{DB, ConnectionManager, Schemifier, 
DefaultConnectionIdentifier, ConnectionIdentifier}
 import java.sql.{Connection, DriverManager}
+import _root_.net.liftweb.mapper.{DB, ConnectionManager, Schemifier, 
DefaultConnectionIdentifier, StandardDBVendor}
 import org.apache.esme._
 import model._
 import org.apache.esme.actor._
@@ -53,12 +54,25 @@ import com.twitter.stats._
  */
 class Boot {
   def boot {
-    // do this before any messages are sent or there's hell to pay
-    // ActorSchedulerFixer.doActorSchedulerFix()
 
+    // Get DB from container if available
+    
     DefaultConnectionIdentifier.jndiName = Props.get("jndi.name") openOr "esme"
 
-    if (!DB.jndiJdbcConnAvailable_?) 
DB.defineConnectionManager(DefaultConnectionIdentifier, DBVendor)
+    // Deal with Database
+        
+    if (!DB.jndiJdbcConnAvailable_?) {
+      val vendor = 
+       new StandardDBVendor(Props.get("db_driver") openOr 
"org.apache.derby.jdbc.EmbeddedDriver",
+                            Props.get("jdbc_connect_url") openOr 
+                            "jdbc:derby:esme_db;create=true",
+                            Props.get("db_user"), Props.get("db_pwd"))
+
+      LiftRules.unloadHooks.append(vendor.closeAllConnections_! _)
+
+      DB.defineConnectionManager(DefaultConnectionIdentifier, vendor)
+    }
+    
     // where to search snippet
     LiftRules.addToPackages("org.apache.esme")
 
@@ -77,6 +91,8 @@ class Boot {
       UrlStore, Tracking, Action, 
       AccessPool, Privilege, UserAuth, UserCryptoSig)
 
+
+    // deal with sending token via URL for old API
     LiftRules.statelessDispatchTable.append {
       case r...@req("api" :: "send_msg" :: Nil, "", PostRequest)
         if r.param("token").isDefined =>
@@ -100,8 +116,8 @@ class Boot {
 
     TableSorter.init
 
-    LiftRules.siteMapFailRedirectLocation = List("index", "Home")
-
+     //Dealing with URL-based request parameters
+     
     LiftRules.rewrite.prepend {
       case RewriteRequest(ParsePath("user" :: user :: Nil, "", _, _), _, _) =>
         RewriteResponse(List("info_view", "user"), Map("uid" -> user))
@@ -118,9 +134,13 @@ class Boot {
 
     LiftRules.dispatch.append(UrlStore.redirectizer)
 
-
+    //What to do when user types in something unknown 
+         
     LiftRules.siteMapFailRedirectLocation = List("index")
 
+
+    // Register Auth methods that are used in ESME
+    
     UserAuth.register(UserPwdAuthModule)
     UserAuth.register(OpenIDAuthModule)
 
@@ -160,9 +180,6 @@ class Boot {
     LiftRules.dispatch.prepend(RestAPI.dispatch)
     LiftRules.dispatch.append(API2.dispatch)
 
-    /*LiftRules.httpAuthProtectedResource.prepend {
-      case ParsePath(l, _, _, _) if l startsWith TwitterAPI.ApiPath => 
Full(AuthRole("user"))
-    }*/
     
     LiftRules.httpAuthProtectedResource.prepend {
       case Req(TwitterAPI.ApiPath :: _,_,_) => Full(AuthRole("user"))
@@ -178,15 +195,17 @@ class Boot {
     //JMX
     if (Props.getBool("jmx.enable", false))
       StatsMBean("org.apache.esme.stats")
+      
+    Stats.makeGauge("users") {Distributor.getUsersCount}
+    Stats.makeGauge("listener") {Distributor.getListenersCount}
 
     Distributor.touch
     SchedulerActor.touch
     MessagePullActor.touch
     // ScalaInterpreter.touch
 
-    Stats.makeGauge("users") {Distributor.getUsersCount}
-    Stats.makeGauge("listener") {Distributor.getListenersCount}
 
+    // Initiating popular links and resent messages
     val resentPeriod = Props.getLong("stats.resent.period", 1 week)
     val resentRefreshInterval: Long = Props.getLong("stats.resent.refresh") 
match {
       case Full(interval) if interval > (1 minute) => interval
@@ -202,6 +221,7 @@ class Boot {
     if (linksPeriod > 0)
       PopStatsActor ! PopStatsActor.StartStats(LinkClickedStat, linksPeriod, 
linksRefreshInterval)
 
+    // Initiating actions
     Action.findAll(By(Action.disabled, false), By(Action.removed, 
false)).foreach {
       _.startActors
     }
@@ -252,57 +272,6 @@ object RequestAnalyzer {
   }
 }
 
-object DBVendor extends ConnectionManager {
-  private var pool: List[Connection] = Nil
-  private var poolSize = 0
-  private val maxPoolSize = 4
-
-  private def createOne: Box[Connection] = try {
-  
-    val driverClass = Props.get("db_driver", 
"org.apache.derby.jdbc.EmbeddedDriver")
-    val db_user = Props.get("db_user", "")
-    val db_pwd = Props.get("db_pwd", "")
-    val jdbc_connect = Props.get("jdbc_connect_url", 
"jdbc:derby:esme_db;create=true")
-    
-    Class.forName(driverClass)
-    val dm = DriverManager.getConnection(jdbc_connect, db_user, db_pwd)
-    Full(dm)
-      
-    } catch {
-    case e: Exception => e.printStackTrace; Empty
-  }
-
-  def newConnection(name: ConnectionIdentifier): Box[Connection] = 
synchronized {
-    pool match {
-      case Nil if poolSize < maxPoolSize => val ret = createOne
-      poolSize = poolSize + 1
-      // ret.foreach(c => pool = c :: pool)
-      ret
-
-      case Nil => wait(1000L); newConnection(name)
-      case x :: xs =>
-        pool = xs
-        try {
-          x.setAutoCommit(false)
-          Full(x)
-        } catch {
-          case e => try {
-            poolSize = poolSize - 1
-            x.close
-            newConnection(name)
-          } catch {
-            case e => newConnection(name)
-          }
-        }
-    }
-  }
-
-  def releaseConnection(conn: Connection): Unit = synchronized {
-    pool = conn :: pool
-    notify
-  }
-}
-
 object SessionInfoDumper extends LiftActor {
   private var lastTime = millis
 


Reply via email to