Hmm... Actually the biggest problem is init-params. Can context
listeners accept init-params these days?

On 9/26/07, Jon Tirsen <[EMAIL PROTECTED]> wrote:
> Yeah, good point. Both this and the RailsTaskServlet could probably be
> refactored into context listeners. I'll see if I have time to do that.
>
> On 9/26/07, Robert Egglestone <[EMAIL PROTECTED]> wrote:
> >
> >  This looks like it would be better as a ServletContextListener, since it
> > doesn't process any servlet requests.
> >
> >  Cheers,
> >  Robert
> >
> >
> >  [EMAIL PROTECTED] wrote:
> >
> >  Revision 743 Author tirsen Date 2007-09-25 03:40:30 -0400 (Tue, 25 Sep
> > 2007)
> > Log Message Extracted servlet to run periodical background tasks from
> > Mingle. Removed the require of rubygems (Mingle does not include rubygems)
> >
> > Modified Paths
> >
> > trunk/rails-integration/src/main/java/org/jruby/webapp/RailsFactory.java
> > Added Paths
> >
> > trunk/rails-integration/src/main/java/org/jruby/webapp/RailsPeriodicalTaskServlet.java
> >
> > Diff
> >
> > Modified:
> > trunk/rails-integration/src/main/java/org/jruby/webapp/RailsFactory.java
> > (742 => 743)
> > ---
> > trunk/rails-integration/src/main/java/org/jruby/webapp/RailsFactory.java
> > 2007-09-21 19:29:39 UTC (rev 742)
> > +++
> > trunk/rails-integration/src/main/java/org/jruby/webapp/RailsFactory.java
> > 2007-09-25 07:40:30 UTC (rev 743)
> > @@ -118,14 +118,6 @@
> >  // This is done in CustomObjectPool by forcing all object creation though a
> > single thread.
> >  runtime.defineReadonlyVariable("$servlet_context",
> > JavaEmbedUtils.javaToRuby(runtime, context));
> >
> > - // test Gems
> > - try {
> > - runtime.getLoadService().require("rubygems");
> > - } catch (RaiseException e) {
> > - logRubyException("Failed to load rubygems", e);
> > - throw new ServletException("Failed to load rubygems. See the logs for more
> > details.");
> > - }
> > -
> >  // start Rails
> >  try {
> >  long startTime = System.currentTimeMillis();
> >
> >
> >
> > Added:
> > trunk/rails-integration/src/main/java/org/jruby/webapp/RailsPeriodicalTaskServlet.java
> > (0 => 743)
> > ---
> > trunk/rails-integration/src/main/java/org/jruby/webapp/RailsPeriodicalTaskServlet.java
> > (rev 0)
> > +++
> > trunk/rails-integration/src/main/java/org/jruby/webapp/RailsPeriodicalTaskServlet.java
> > 2007-09-25 07:40:30 UTC (rev 743)
> > @@ -0,0 +1,97 @@
> > +package org.jruby.webapp;
> > +
> > +import org.jruby.Ruby;
> > +import org.jruby.webapp.RailsServlet;
> > +
> > +import javax.servlet.ServletConfig;
> > +import javax.servlet.ServletException;
> > +import javax.servlet.http.HttpServletRequest;
> > +import javax.servlet.http.HttpServletResponse;
> > +import java.io.IOException;
> > +
> > +public class RailsPeriodicalTaskServlet extends RailsServlet {
> > + private String command;
> > + private int waitBeforeStartSeconds = 30; // wait 30 seconds
> > + private boolean stop = false; // wait 30 seconds
> > + private Thread thread = null;
> > + private int interval = 60;
> > + private int minIdle = 0;
> > + private static final int FIFTEEN_MINUTES_IN_MILLIS = 1000 * 60 * 15;
> > +
> > + public void init(final ServletConfig servletConfig) throws
> > ServletException {
> > + super.init(servletConfig);
> > +
> > + command = servletConfig.getInitParameter("command");
> > + String waitBeforeStartSecondsString =
> > servletConfig.getInitParameter("waitBeforeStartSeconds");
> > + if (waitBeforeStartSecondsString != null) {
> > + waitBeforeStartSeconds = Integer.parseInt(waitBeforeStartSecondsString);
> > + }
> > + String minIdleString = servletConfig.getInitParameter("minIdle");
> > + if (minIdleString != null) {
> > + minIdle = Integer.parseInt(minIdleString);
> > + }
> > + String intervalSecondsString = servletConfig.getInitParameter("interval");
> > + if (intervalSecondsString != null) {
> > + interval = Integer.parseInt(intervalSecondsString);
> > + }
> > +
> > + thread = new Thread(new Runnable() {
> > + public void run() {
> > + try {
> > + // wait for a little while before starting the task
> > + // this allow the app server to start serving requests before initializing
> > all tasks
> > + Thread.sleep(waitBeforeStartSeconds * 1000);
> > +
> > + while (!stop) {
> > + runOnce();
> > + Thread.sleep(interval * 1000); // wait for interval
> > + }
> > + } catch (InterruptedException e) {
> > + // break out of loop
> > + } catch (Exception e) {
> > + servletConfig.getServletContext().log("Could not start " + command, e);
> > + }
> > + }
> > + });
> > + thread.start();
> > + }
> > +
> > + private void runOnce() throws Exception {
> > + // run task only if idles are more than required
> > + // default is 0 which means it will always run
> > + // (potentially causing another instance to get started)
> > + if (getRuntimePool().getNumIdle() <= minIdle) {
> > + return;
> > + }
> > + Ruby runtime = null;
> > + try {
> > + runtime = (Ruby) getRuntimePool().borrowObject();
> > + runtime.evalScript(command);
> > + getRuntimePool().returnObject(runtime);
> > + } catch (Exception e) {
> > + getServletContext().log("Could not execute: " + command, e);
> > + getRuntimePool().invalidateObject(runtime);
> > + getServletContext().log(command + " returning JRuby runtime to pool and
> > will restart in 15 minutes.");
> > + try {
> > + Thread.sleep(FIFTEEN_MINUTES_IN_MILLIS);
> > + } catch (InterruptedException ex) {
> > + // can't do much here ...
> > + }
> > + }
> > + }
> > +
> > + public void destroy() {
> > + stop = true;
> > + thread.interrupt();
> > + try {
> > + thread.join();
> > + } catch (InterruptedException e) {
> > + }
> > +
> > + super.destroy();
> > + }
> > +
> > + protected void service(HttpServletRequest request, HttpServletResponse
> > response) throws ServletException, IOException {
> > + throw new ServletException("Not supported");
> > + }
> > +}
> >
> >  ________________________________
> >
> > _______________________________________________
> > Jruby-extras-devel mailing list
> > [email protected]
> > http://rubyforge.org/mailman/listinfo/jruby-extras-devel
> >
> > _______________________________________________
> > Jruby-extras-devel mailing list
> > [email protected]
> > http://rubyforge.org/mailman/listinfo/jruby-extras-devel
> >
>
_______________________________________________
Jruby-extras-devel mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/jruby-extras-devel

Reply via email to