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