Author: ab
Date: Fri Oct 29 13:42:15 2010
New Revision: 1028736

URL: http://svn.apache.org/viewvc?rev=1028736&view=rev
Log:
NUTCH-931 Simple admin API to fetch status and stop the service.

Added:
    nutch/trunk/src/java/org/apache/nutch/api/AdminResource.java   (with props)
Modified:
    nutch/trunk/CHANGES.txt
    nutch/trunk/src/java/org/apache/nutch/api/APIInfoResource.java
    nutch/trunk/src/java/org/apache/nutch/api/NutchApp.java
    nutch/trunk/src/java/org/apache/nutch/api/NutchServer.java

Modified: nutch/trunk/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/nutch/trunk/CHANGES.txt?rev=1028736&r1=1028735&r2=1028736&view=diff
==============================================================================
--- nutch/trunk/CHANGES.txt (original)
+++ nutch/trunk/CHANGES.txt Fri Oct 29 13:42:15 2010
@@ -86,6 +86,8 @@ Release 2.0 - Current Development
 
 * NUTCH-930 Remove remaining dependencies on Lucene API (ab)
 
+* NUTCH-931 Simple admin API to fetch status and stop the service (ab)
+
 Release 1.1 - 2010-06-06
 
 * NUTCH-819 Included Solr schema.xml and solrindex-mapping.xml don't play 
together (ab)

Modified: nutch/trunk/src/java/org/apache/nutch/api/APIInfoResource.java
URL: 
http://svn.apache.org/viewvc/nutch/trunk/src/java/org/apache/nutch/api/APIInfoResource.java?rev=1028736&r1=1028735&r2=1028736&view=diff
==============================================================================
--- nutch/trunk/src/java/org/apache/nutch/api/APIInfoResource.java (original)
+++ nutch/trunk/src/java/org/apache/nutch/api/APIInfoResource.java Fri Oct 29 
13:42:15 2010
@@ -11,6 +11,7 @@ public class APIInfoResource extends Ser
   private static final List<String[]> info = new ArrayList<String[]>();
   
   static {
+    info.add(new String[]{AdminResource.PATH, AdminResource.DESCR});
     info.add(new String[]{ConfResource.PATH, ConfResource.DESCR});
     info.add(new String[]{JobResource.PATH, JobResource.DESCR});
   }

Added: nutch/trunk/src/java/org/apache/nutch/api/AdminResource.java
URL: 
http://svn.apache.org/viewvc/nutch/trunk/src/java/org/apache/nutch/api/AdminResource.java?rev=1028736&view=auto
==============================================================================
--- nutch/trunk/src/java/org/apache/nutch/api/AdminResource.java (added)
+++ nutch/trunk/src/java/org/apache/nutch/api/AdminResource.java Fri Oct 29 
13:42:15 2010
@@ -0,0 +1,57 @@
+package org.apache.nutch.api;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.nutch.api.JobStatus.State;
+import org.restlet.resource.Get;
+import org.restlet.resource.ServerResource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class AdminResource extends ServerResource {
+  private static final Logger LOG = 
LoggerFactory.getLogger(AdminResource.class);
+
+  public static final String PATH = "admin";
+  public static final String DESCR = "Service admin actions";
+
+  @Get("json")
+  public Object execute() throws Exception {
+    String cmd = (String)getRequestAttributes().get(Params.CMD);
+    if ("status".equalsIgnoreCase(cmd)) {
+      // status
+      Map<String,Object> res = new HashMap<String,Object>();
+      res.put("started", NutchApp.started);
+      Map<String,Object> jobs = new HashMap<String,Object>();      
+      jobs.put("all", NutchApp.jobMgr.list(null, State.ANY));
+      jobs.put("running", NutchApp.jobMgr.list(null, State.RUNNING));
+      res.put("jobs", jobs);
+      res.put("confs", NutchApp.confMgr.list());
+      return res;
+    } else if ("stop".equalsIgnoreCase(cmd)) {
+      // stop
+      if (NutchApp.server.canStop()) {
+        Thread t = new Thread() {
+          public void run() {
+            try {
+              Thread.sleep(1000);
+              NutchApp.server.stop(false);
+              LOG.info("Service stopped.");
+            } catch (Exception e) {
+              LOG.error("Error stopping", e);
+            };
+          }
+        };
+        t.setDaemon(true);
+        t.start();
+        LOG.info("Service shutting down...");
+        return "stopping";
+      } else {
+        LOG.info("Command 'stop' denied due to unfinished jobs");
+        return "can't stop now";
+      }
+    } else {
+      return "Unknown command " + cmd;
+    }
+  }
+}

Propchange: nutch/trunk/src/java/org/apache/nutch/api/AdminResource.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: nutch/trunk/src/java/org/apache/nutch/api/NutchApp.java
URL: 
http://svn.apache.org/viewvc/nutch/trunk/src/java/org/apache/nutch/api/NutchApp.java?rev=1028736&r1=1028735&r2=1028736&view=diff
==============================================================================
--- nutch/trunk/src/java/org/apache/nutch/api/NutchApp.java (original)
+++ nutch/trunk/src/java/org/apache/nutch/api/NutchApp.java Fri Oct 29 13:42:15 
2010
@@ -1,7 +1,5 @@
 package org.apache.nutch.api;
 
-import java.util.logging.Level;
-
 import org.apache.nutch.api.impl.RAMConfManager;
 import org.apache.nutch.api.impl.RAMJobManager;
 import org.restlet.Application;
@@ -11,6 +9,8 @@ import org.restlet.routing.Router;
 public class NutchApp extends Application {
   public static ConfManager confMgr;
   public static JobManager jobMgr;
+  public static NutchServer server;
+  public static long started;
   
   static {
     confMgr = new RAMConfManager();
@@ -25,9 +25,12 @@ public class NutchApp extends Applicatio
       getTunnelService().setEnabled(true);
       getTunnelService().setExtensionsTunnel(true);
       Router router = new Router(getContext());
-      router.getLogger().setLevel(Level.FINEST);
+      //router.getLogger().setLevel(Level.FINEST);
       // configs
       router.attach("/", APIInfoResource.class);
+      router.attach("/" + AdminResource.PATH, AdminResource.class);
+      router.attach("/" + AdminResource.PATH + "/{" + Params.CMD + 
+          "}", AdminResource.class);
       router.attach("/" + ConfResource.PATH, ConfResource.class);
       router.attach("/" + ConfResource.PATH + "/{"+ Params.CONF_ID +
           "}", ConfResource.class);

Modified: nutch/trunk/src/java/org/apache/nutch/api/NutchServer.java
URL: 
http://svn.apache.org/viewvc/nutch/trunk/src/java/org/apache/nutch/api/NutchServer.java?rev=1028736&r1=1028735&r2=1028736&view=diff
==============================================================================
--- nutch/trunk/src/java/org/apache/nutch/api/NutchServer.java (original)
+++ nutch/trunk/src/java/org/apache/nutch/api/NutchServer.java Fri Oct 29 
13:42:15 2010
@@ -21,14 +21,15 @@ public class NutchServer {
     this.port = port;
     // Create a new Component. 
     component = new Component();
-    component.getLogger().setLevel(Level.FINEST);
+    //component.getLogger().setLevel(Level.FINEST);
    
     // Add a new HTTP server listening on port 8182. 
     component.getServers().add(Protocol.HTTP, port); 
    
     // Attach the application. 
     app = new NutchApp();
-    component.getDefaultHost().attach("/nutch", app); 
+    component.getDefaultHost().attach("/nutch", app);
+    NutchApp.server = this;
   }
   
   public boolean isRunning() {
@@ -36,19 +37,27 @@ public class NutchServer {
   }
   
   public void start() throws Exception {
-    LOG.info("Statring NutchServer on port " + port + "...");
+    LOG.info("Starting NutchServer on port " + port + "...");
     component.start();
     LOG.info("Started NutchServer on port " + port);
     running = true;
+    NutchApp.started = System.currentTimeMillis();
+  }
+  
+  public boolean canStop() throws Exception {
+    List<JobStatus> jobs = NutchApp.jobMgr.list(null, State.RUNNING);
+    if (!jobs.isEmpty()) {
+      return false;
+    }
+    return true;
   }
   
   public boolean stop(boolean force) throws Exception {
     if (!running) {
       return true;
     }
-    List<JobStatus> jobs = NutchApp.jobMgr.list(null, State.RUNNING);
-    if (!jobs.isEmpty() && !force) {
-      LOG.warn("There are running jobs - NOT stopping at this time...");
+    if (!canStop() && !force) {
+      LOG.warn("Running jobs - can't stop now.");
       return false;
     }
     LOG.info("Stopping NutchServer on port " + port + "...");


Reply via email to