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
<#trunkrailsintegrationsrcmainjavaorgjrubywebappRailsFactoryjava>
Added Paths
*
trunk/rails-integration/src/main/java/org/jruby/webapp/RailsPeriodicalTaskServlet.java
<#trunkrailsintegrationsrcmainjavaorgjrubywebappRailsPeriodicalTaskServletjava>
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