Tim, Please take a look at LiftRules.unloadHooks. These functions will be executed when the servlet is unloading.
With that being said, I'd suggest not using Jetty's auto-restart feature. If you do, please use an external RDBMS (I find Postgres to be the best) rather than Derby. Thanks, David On Sat, Aug 1, 2009 at 9:07 AM, Tim Nelson <tnell...@gmail.com> wrote: > > I just read your original post and that error is exactly what I was > referring to in my last post. The problem is, by default, the database > shuts down when the jvm shuts down. So, if you want to dynamically > restart jetty, you need a way to shutdown the db if the jvm is not > shutown. You can do as I described in my last post, using sbt, but > there are other options. I'm not sure if that will work with mvn. > > H2 comes with a DbStarter [1] ServletContextListener that will start > up and shutdown the db. It can also start up a tcp server, if you need > that. However, it requires you to specify the db url, user, and pass > as context-params. Which is a show stopper for me. > > There is only one line in DbStarter that one would really need and > that is a sql statement that is sent to the db. This code is in the > contextDestroyed method. So, if there is a way in Lift to call some > code when the servlet context is destroyed, then one could put that > sql statement there and manually shutdown the db. > > I realize you use Derby, but I'm guessing that it works similarly. > > So, Lifters, is there a way to call some code when the context is > destroyed? Or, is there another way to accomplish this? > > [1] > http://code.google.com/p/h2database/source/browse/trunk/h2/src/main/org/h2/server/web/DbStarter.java > > On Aug 1, 10:25 am, Tim Nelson <tnell...@gmail.com> wrote: > > I was having the same problems using jetty's hot deploy with ~ prepare- > > webapp in sbt so I switched to using JavaRebel. It works much better > > and I haven't had any problems with reloading since. I don't think > > there's any info on the sbt site about jrebel, but it's real easy to > > get set up. Just install it and get a license (free for scala use) > > from them at:http://www.zeroturnaround.com/scala-license/ > > > > Then change your sbt script to: > > java -Xmx256M -noverify -javaagent:/path/to/javarebel-2.0.2/ > > javarebel.jar -jar `dirname $0`/sbt-launcher-0.5.1.jar "$@" > > > > I did run into a problem using an embedded H2 database, which may or > > may not occur with Derby, when using jetty-run/jetty-stop from the sbt > > prompt. What happens is jetty-stop does not shutdown the jvm, so H2 > > doesn't shut down. To get around this I use "sbt jetty" directly in > > the terminal, that way when you stop it, the jvm shuts down and the db > > with it. I then have a second terminal that I open an sbt prompt in > > and use ~ prepare-webapp. > > > > For me, this setup has worked much better. > > > > Tim > > > > On Aug 1, 9:39 am, "Nolan Darilek" <no...@thewordnerd.info> wrote: > > > > > Wondering if anyone has gotten a chance to take a look at this? Life > got > > > busy, and since my Lift projects aren't commercial just yet, they went > > > on the back burner. But I'm still seeing this. > > > > > Also, not sure how I missed this question, but I don't think SBT is > > > undeploying the app before redeploying. Should it be? Maybe this is an > > > SBT rather than a Lift issue? > > > > > Here is a partial transcript of an SBT session, not sure if these are > > > the same errors. It involves me making a code change, at which point > > > ~prepare-webapp picks it up and redeploys. I then get an error, try > > > stopping and relaunching Jetty and get another. Also, after that point, > > > I can't access the web app unless I completely restart SBT. Sorry for > > > the ANSI escape sequences in this. > > > > > If this is an SBT issue then I'll gladly take it to that list. Thanks > > > for looking into this! > > > > > ERROR - Failed to Boot > > > java.lang.IllegalStateException: Cannot modify after boot. > > > at > net.liftweb.http.RulesSeq$class.safe_$qmark(LiftRules.scala:1056) > > > at net.liftweb.http.RulesSeq$class.prepend(LiftRules.scala:1063) > > > at net.liftweb.http.RulesSeq$$anon$5.prepend(LiftRules.scala:1043) > > > at net.liftweb.http.LiftFilter.preBoot(LiftServlet.scala:564) > > > at net.liftweb.http.LiftFilter.bootLift(LiftServlet.scala:555) > > > at net.liftweb.http.LiftFilter.init(LiftServlet.scala:530) > > > at > > > org.mortbay.jetty.servlet.FilterHolder.doStart(FilterHolder.java:97) > > > at > > > > org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50) > > > at > > > > org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:620) > > > > > at > org.mortbay.jetty.servlet.Context.startContext(Context.java:140) > > > at > > > > org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1234) > > > > > at > > > > org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517) > > > at > > > org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:460) > > > at > > > > org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50) > > > at > > > > sbt.LazyJettyRun$$anonfun$sbt$LazyJettyRun$$reload$6.apply(WebApp.scala:198) > > > > > at > > > > sbt.LazyJettyRun$$anonfun$sbt$LazyJettyRun$$reload$6.apply(WebApp.scala:198) > > > > > at scala.List.foreach(List.scala:841) > > > at sbt.LazyJettyRun$.sbt$LazyJettyRun$$reload(WebApp.scala:198) > > > at sbt.LazyJettyRun$$anon$1.filesChanged(WebApp.scala:124) > > > at org.mortbay.util.Scanner.reportBulkChanges(Scanner.java:486) > > > at org.mortbay.util.Scanner.reportDifferences(Scanner.java:352) > > > at org.mortbay.util.Scanner.scan(Scanner.java:280) > > > at org.mortbay.util.Scanner$1.run(Scanner.java:232) > > > at java.util.TimerThread.mainLoop(Timer.java:512) > > > at java.util.TimerThread.run(Timer.java:462) > > > [0m[ [0minfo [0m] [0mReload complete. [0m > > > [0m[ [0minfo [0m] [0mCompilation successful. [0m > > > [0m[ [0minfo [0m] [0m Post-analysis: 17 classes. [0m > > > [0m[ [0minfo [0m] [34m== compile == [0m > > > [0m[ [0minfo [0m] [34m [0m > > > [0m[ [0minfo [0m] [34m== prepare-webapp == [0m > > > [0m[ [0minfo [0m] [34m== prepare-webapp == [0m > > > [0m[ [32msuccess [0m] [0mSuccessful. [0m > > > [0m[ [0minfo [0m] [0m [0m > > > [0m[ [0minfo [0m] [0mTotal time: 10 s [0m > > > Waiting for source changes... (press any key to interrupt) > > > [0m[ [0minfo [0m] [0mReloading web application... [0m > > > [0m[ [0minfo [0m] [0mNO JSP Support for /, did not find > > > org.apache.jasper.servlet.JspServlet [0m > > > ERROR - Failed to Boot > > > java.lang.IllegalStateException: Cannot modify after boot. > > > at > net.liftweb.http.RulesSeq$class.safe_$qmark(LiftRules.scala:1056) > > > at net.liftweb.http.RulesSeq$class.prepend(LiftRules.scala:1063) > > > at net.liftweb.http.RulesSeq$$anon$5.prepend(LiftRules.scala:1043) > > > at net.liftweb.http.LiftFilter.preBoot(LiftServlet.scala:564) > > > at net.liftweb.http.LiftFilter.bootLift(LiftServlet.scala:555) > > > at net.liftweb.http.LiftFilter.init(LiftServlet.scala:530) > > > at > > > org.mortbay.jetty.servlet.FilterHolder.doStart(FilterHolder.java:97) > > > at > > > > org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50) > > > at > > > > org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:620) > > > > > at > org.mortbay.jetty.servlet.Context.startContext(Context.java:140) > > > at > > > > org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1234) > > > > > at > > > > org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517) > > > at > > > org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:460) > > > at > > > > org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50) > > > at > > > > sbt.LazyJettyRun$$anonfun$sbt$LazyJettyRun$$reload$6.apply(WebApp.scala:198) > > > > > at > > > > sbt.LazyJettyRun$$anonfun$sbt$LazyJettyRun$$reload$6.apply(WebApp.scala:198) > > > > > at scala.List.foreach(List.scala:841) > > > at sbt.LazyJettyRun$.sbt$LazyJettyRun$$reload(WebApp.scala:198) > > > at sbt.LazyJettyRun$$anon$1.filesChanged(WebApp.scala:124) > > > at org.mortbay.util.Scanner.reportBulkChanges(Scanner.java:486) > > > at org.mortbay.util.Scanner.reportDifferences(Scanner.java:352) > > > at org.mortbay.util.Scanner.scan(Scanner.java:280) > > > at org.mortbay.util.Scanner$1.run(Scanner.java:232) > > > at java.util.TimerThread.mainLoop(Timer.java:512) > > > at java.util.TimerThread.run(Timer.java:462) > > > [0m[ [0minfo [0m] [0mReload complete. [0m > > > > > > jetty-stop > > > [0m[ [0minfo [0m] [34m [0m > > > [0m[ [0minfo [0m] [34m== jetty-stop == [0m > > > [0m[ [0minfo [0m] [34m== jetty-stop == [0m > > > [0m[ [32msuccess [0m] [0mSuccessful. [0m > > > [0m[ [0minfo [0m] [0m [0m > > > [0m[ [0minfo [0m] [0mTotal time: 0 s [0m > > > > jetty-run > > > [0m[ [0minfo [0m] [34m [0m > > > [0m[ [0minfo [0m] [34m== compile == [0m > > > [0m[ [0minfo [0m] [0m Source analysis: 0 new/modified, 0 indirectly > > > invalidated, 0 removed. [0m > > > [0m[ [0minfo [0m] [0mCompiling main sources... [0m > > > [0m[ [0minfo [0m] [0mNothing to compile. [0m > > > [0m[ [0minfo [0m] [0m Post-analysis: 17 classes. [0m > > > [0m[ [0minfo [0m] [34m== compile == [0m > > > [0m[ [0minfo [0m] [34m [0m > > > [0m[ [0minfo [0m] [34m== prepare-webapp == [0m > > > [0m[ [0minfo [0m] [34m== prepare-webapp == [0m > > > [0m[ [0minfo [0m] [34m [0m > > > [0m[ [0minfo [0m] [34m== jetty-run == [0m > > > 2009-07-30 08:49:12.337::INFO: Logging to STDERR via > > > org.mortbay.log.StdErrLog > > > [0m[ [0minfo [0m] [0mjetty-6.1.14 [0m > > > [0m[ [0minfo [0m] [0mNO JSP Support for /, did not find > > > org.apache.jasper.servlet.JspServlet [0m > > > java.sql.SQLException: Failed to start database 'lift_example', see the > > > next exception for details. > > > at > > > > org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown > > > Source) > > > at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown > > > Source) > > > at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown > > > Source) > > > at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown > > > Source) > > > at > > > org.apache.derby.impl.jdbc.EmbedConnection.newSQLException(Unknown > Source) > > > at org.apache.derby.impl.jdbc.EmbedConnection.bootDatabase(Unknown > > > Source) > > > at org.apache.derby.impl.jdbc.EmbedConnection.<init>(Unknown > Source) > > > at org.apache.derby.impl.jdbc.EmbedConnection30.<init>(Unknown > Source) > > > at org.apache.derby.impl.jdbc.EmbedConnection40.<init>(Unknown > Source) > > > at org.apache.derby.jdbc.Driver40.getNewEmbedConnection(Unknown > > > Source) > > > at org.apache.derby.jdbc.InternalDriver.connect(Unknown Source) > > > at org.apache.derby.jdbc.AutoloadedDriver.connect(Unknown Source) > > > at java.sql.DriverManager.getConnection(DriverManager.java:582) > > > at java.sql.DriverManager.getConnection(DriverManager.java:207) > > > at bootstrap.liftweb.DBVendor$.createOne(Boot.scala:79) > > > at bootstrap.liftweb.DBVendor$.newConnection(Boot.scala:91) > > > at net.liftweb.mapper.DB$$anonfun$2.apply(DB.scala:89) > > > at net.liftweb.mapper.DB$$anonfun$2.apply(DB.scala:89) > > > at net.liftweb.util.Full.flatMap(Box.scala:332) > > > at net.liftweb.mapper.DB$.newConnection(DB.scala:89) > > > at net.liftweb.mapper.DB$.getConnection(DB.scala:136) > > > at net.liftweb.mapper.DB$.use(DB.scala:315) > > > at net.liftweb.mapper.Schemifier$.schemify(Schemifier.scala:53) > > > at net.liftweb.mapper.Schemifier$.schemify(Schemifier.scala:36) > > > at > > > > ... > > > > read more ยป > > > -- Lift, the simply functional web framework http://liftweb.net Beginning Scala http://www.apress.com/book/view/1430219890 Follow me: http://twitter.com/dpp Git some: http://github.com/dpp --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Lift" group. To post to this group, send email to liftweb@googlegroups.com To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/liftweb?hl=en -~----------~----~----~----~------~----~------~--~---