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 + "...");