You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by de...@apache.org on 2013/03/19 16:58:03 UTC

svn commit: r1458363 - in /uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc: api/test/ cli/

Author: degenaro
Date: Tue Mar 19 15:58:02 2013
New Revision: 1458363

URL: http://svn.apache.org/r1458363
Log:
UIMA-2732 DUCC support for monitoring of Managed Reservations, CLI enhancements

Added:
    uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccManagedReservationCancel.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccManagedReservationMonitor.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccManagedReservationSubmit.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccMonitor.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/IDuccMonitor.java
Modified:
    uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/api/test/Test.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/CliBase.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccJobMonitor.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccJobSubmit.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccServiceCancel.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccUiConstants.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccletSubmit.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/IUiOptions.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/MonitorListener.java

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/api/test/Test.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/api/test/Test.java?rev=1458363&r1=1458362&r2=1458363&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/api/test/Test.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/api/test/Test.java Tue Mar 19 15:58:02 2013
@@ -21,13 +21,12 @@ package org.apache.uima.ducc.api.test;
 import org.apache.uima.ducc.api.IDuccMessageProcessor;
 import org.apache.uima.ducc.cli.DuccJobMonitor;
 
-
 public class Test {
 
 	public static void main(String[] args) {
 		try {
 			IDuccMessageProcessor messageHandler = new MessageHandler();
-			DuccJobMonitor duccJobMonitor = new DuccJobMonitor(messageHandler, false);
+			DuccJobMonitor duccJobMonitor = new DuccJobMonitor(messageHandler);
 			duccJobMonitor.run(args);
 		} catch (Exception e) {
 			e.printStackTrace();

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/CliBase.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/CliBase.java?rev=1458363&r1=1458362&r2=1458363&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/CliBase.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/CliBase.java Tue Mar 19 15:58:02 2013
@@ -46,6 +46,7 @@ import org.apache.uima.ducc.common.utils
 import org.apache.uima.ducc.common.utils.Utils;
 import org.apache.uima.ducc.transport.dispatcher.DuccEventHttpDispatcher;
 import org.apache.uima.ducc.transport.event.AbstractDuccOrchestratorEvent;
+import org.apache.uima.ducc.transport.event.IDuccContext.DuccContext;
 
 public abstract class CliBase
     implements IUiOptions
@@ -601,7 +602,7 @@ public abstract class CliBase
     }
 
     // TODO TODO TODO - do we have to support lots of these for multi-threaded stuff?  Hope not ...
-    protected synchronized void startMonitors(boolean start_stdin)
+    protected synchronized void startMonitors(boolean start_stdin, DuccContext context)
     	throws Exception
     {
         int wait_count = 0;
@@ -611,16 +612,17 @@ public abstract class CliBase
             wait_count++;
         }
         
-        if ( cli_props.containsKey(UiOption.ServiceTypeOther.pname() ) ) {
-            if ( debug ) addMessage("Bypassing monitor for ducclet.");
-        } else {    
-            boolean monitor_attach = 
-                (cli_props.containsKey(UiOption.WaitForCompletion.pname()) || ( console_attach ));
+        boolean monitor_attach = 
+                (
+                cli_props.containsKey(UiOption.WaitForCompletion.pname()) || 
+                cli_props.containsKey(UiOption.CancelJobOnInterrupt.pname()) || 
+                cli_props.containsKey(UiOption.CancelManagedReservationOnInterrupt.pname()) ||
+                console_attach
+                );
             
-            if ( monitor_attach ) {
-                wait_count++;
-                startJobMonitor(console_attach && !cli_props.containsKey(UiOption.WaitForCompletion.pname()));
-            }
+        if ( monitor_attach ) {
+            wait_count++;
+            startMonitor(context);
         }
 
         if ( wait_count > 0 ) {
@@ -628,11 +630,15 @@ public abstract class CliBase
         }
     }
 
-    protected synchronized void startJobMonitor(boolean quiet)
+    protected synchronized void startMonitor(DuccContext context)
     {
-        monitor_listener = new MonitorListener(this, friendlyId, cli_props, quiet);
+        monitor_listener = new MonitorListener(this, friendlyId, cli_props, context);
 
-        if (cli_props.containsKey(UiOption.WaitForCompletion.pname()) || ( console_listener != null) ) {
+        if (	cli_props.containsKey(UiOption.WaitForCompletion.pname()) || 
+        		cli_props.containsKey(UiOption.CancelJobOnInterrupt.pname()) || 
+        		cli_props.containsKey(UiOption.CancelManagedReservationOnInterrupt.pname()) ||
+        		(console_listener != null) 
+        	) {
             Thread mlt = new Thread(monitor_listener);  //MonitorListenerThread
             mlt.start();
         }

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccJobMonitor.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccJobMonitor.java?rev=1458363&r1=1458362&r2=1458363&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccJobMonitor.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccJobMonitor.java Tue Mar 19 15:58:02 2013
@@ -18,445 +18,82 @@
 */
 package org.apache.uima.ducc.cli;
 
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.lang.management.ManagementFactory;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLConnection;
 import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicInteger;
 
-import org.apache.commons.cli.CommandLine;
-import org.apache.commons.cli.CommandLineParser;
 import org.apache.commons.cli.HelpFormatter;
-import org.apache.commons.cli.OptionBuilder;
 import org.apache.commons.cli.Options;
-import org.apache.commons.cli.PosixParser;
-import org.apache.uima.ducc.api.DuccMessage;
 import org.apache.uima.ducc.api.IDuccMessageProcessor;
-import org.apache.uima.ducc.common.json.MonitorInfo;
-import org.apache.uima.ducc.common.utils.DuccPropertiesResolver;
-import org.apache.uima.ducc.common.utils.Utils;
+import org.apache.uima.ducc.cli.IUiOptions.UiOption;
+import org.apache.uima.ducc.transport.event.IDuccContext.DuccContext;
 
-import com.google.gson.Gson;
+public class DuccJobMonitor extends DuccMonitor implements IDuccMonitor {
 
-/**
- * Monitor a DUCC job
- */
-
-public class DuccJobMonitor extends DuccUi {
-private Thread main = null;
-	
-	private static final int RC_UNKNOWN = -1;
-	private static final int RC_SUCCESS = 0;
-	private static final int RC_FAILURE = 1;
-	
-	private static final int RC_HELP = RC_SUCCESS;
-	
-	private static final String NotFound = "NotFound";
-	
-	private static final String StateRunning 	= "Running";
-	private static final String StateCompleting = "Completing";
-	private static final String StateCompleted 	= "Completed";
-	
-	private AtomicInteger rc = new AtomicInteger(RC_UNKNOWN);
-	private AtomicBoolean cancel_job_on_interrupt = new AtomicBoolean(false);
-	
-	private String jobId = null;
-	
-	private boolean info = true;
-	private boolean error = true;
-	private boolean debug = false;
-    private boolean quiet = false;
-	private boolean timestamp = false;
-	
-	private int milliseconds 	= 1;
-	private int seconds		 	= 1000*milliseconds;
-	private int wakeupInterval 	= 15*seconds;
-	
-	private int urlTimeout = 60*seconds;
+	public static String servlet = "/ducc-servlet/proxy-job-status";
 	
-	private IDuccMessageProcessor duccMessageProcessor = new DuccMessage();
-	
-	DuccPropertiesResolver duccPropertiesResolver;
-
-	private void debug(String message) {
-		if(debug) {
-			duccMessageProcessor.out(timestamp(message));
-		}
+	public DuccJobMonitor() {
+		super(DuccContext.Job, true);
 	}
 	
-	private void debug(Exception e) {
-		if(debug) {
-			duccMessageProcessor.exception(e);
-		}
-	}
-	
-	private void info(String message) {
-		if(info && !quiet) {
-			duccMessageProcessor.out(timestamp(message));
-		}
-	}
-	
-	private void error(String message) {
-		if(error) {
-			duccMessageProcessor.out(timestamp(message));
-		}
-	}
-	
-	private String timestamp(String message) {
-		String tMessage = message;
-		if(timestamp) {
-			String date = new java.text.SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new java.util.Date());
-			tMessage = date+" "+message;
-		}
-		return tMessage;
+	public DuccJobMonitor(IDuccMessageProcessor messageProcessor) {
+		super(DuccContext.Job, true, messageProcessor);
 	}
 	
+	@Deprecated
 	public DuccJobMonitor(boolean quiet) {
-        this.quiet = quiet;
+		super(DuccContext.Job, true);
 	}
 	
-	public DuccJobMonitor(IDuccMessageProcessor duccMessageProcessor, boolean quiet) {
-        this.quiet = quiet;
-		this.duccMessageProcessor = duccMessageProcessor;
+	@Deprecated
+	public DuccJobMonitor(IDuccMessageProcessor messageProcessor, boolean quiet) {
+		super(DuccContext.Job, true, messageProcessor);
 	}
 	
-	@SuppressWarnings("static-access")
-	private void addOptions(Options options) {
-		options.addOption(OptionBuilder
-				.withDescription(DuccUiConstants.desc_help).hasArg(false)
-				.withLongOpt(DuccUiConstants.name_help).create());
-		options.addOption(OptionBuilder
-				.withDescription(DuccUiConstants.desc_debug).hasArg(false)
-				.withLongOpt(DuccUiConstants.name_debug).create());
-		options.addOption(OptionBuilder
-				.withDescription(DuccUiConstants.desc_timestamp).hasArg(false)
-				.withLongOpt(DuccUiConstants.name_timestamp).create());
-		options.addOption(OptionBuilder
-				.withArgName(DuccUiConstants.parm_job_id)
-				.withDescription(makeDesc(DuccUiConstants.desc_job_id,DuccUiConstants.exmp_job_id)).hasArg()
-				.withLongOpt(DuccUiConstants.name_job_id).create());
-		options.addOption(OptionBuilder
-				.withDescription(DuccUiConstants.desc_monitor_cancel_job_on_interrupt).hasArg(false)
-				.withLongOpt(DuccUiConstants.name_monitor_cancel_job_on_interrupt).create());
-	}
-	
-	protected void help(Options options) {
-		HelpFormatter formatter = new HelpFormatter();
-		formatter.setWidth(DuccUiConstants.help_width);
-		formatter.printHelp(DuccJobMonitor.class.getName(), options);
-		rc.set(RC_HELP);
-		return;
+	private DuccJobMonitor(String uniqueSignature) {
+		super(DuccContext.Job, false);
 	}
-	
-	private String getSingleLineStatus(String urlString) {
-		String line = null;
-		URL url = null;
+
+	public static void main(String[] args) {
+		int code = RC_FAILURE;
 		try {
-		    url = new URL(urlString);
-		    URLConnection uc = url.openConnection();
-		    uc.setReadTimeout(urlTimeout); 
-		    BufferedReader br = new BufferedReader(new InputStreamReader(uc.getInputStream()));
-		    line = br.readLine();
-		    br.close();
+			String unique = null;
+			DuccJobMonitor jobMonitor = new DuccJobMonitor(unique);
+			code = jobMonitor.run(args);
 		} 
-		catch (MalformedURLException e) {
-		    e.printStackTrace();
-		}
-		catch(IOException e) {
+		catch (Exception e) {
 			e.printStackTrace();
-		} 
-		return line;
-	}
-	
-	private String getUrlString(String id) {
-		String host = duccPropertiesResolver.getFileProperty("ducc.ws.node");
-		if(host == null) {
-			host = duccPropertiesResolver.getFileProperty("ducc.head");
 		}
-		String port = duccPropertiesResolver.getFileProperty("ducc.ws.port");
-		String urlString = "http://"+host+":"+port+"/ducc-servlet/proxy-job-status?id="+id;
-		debug(urlString);
-		return urlString;
-	}
-	
-	private void adjustWakeupInterval() {
-		String rate = duccPropertiesResolver.getFileProperty("ducc.orchestrator.state.publish.rate");
-		try {
-			wakeupInterval = Integer.parseInt(rate);
-		}
-		catch(Exception e) {
-			debug(e);
-		}
-	}
-	
-	private String details(MonitorInfo monitorInfo) {
-		StringBuffer sb = new StringBuffer();
-		sb.append(" ");
-		sb.append("total:");
-		sb.append(monitorInfo.total);
-		sb.append(" ");
-		sb.append("done:");
-		sb.append(monitorInfo.done);
-		sb.append(" ");
-		sb.append("error:");
-		sb.append(monitorInfo.error);
-		sb.append(" ");
-		sb.append("retry:");
-		sb.append(monitorInfo.retry);
-		sb.append(" ");
-		sb.append("procs:");
-		sb.append(monitorInfo.procs);
-		return sb.toString();
-	}
-	
-	private int runInternal(String[] args) throws Exception {
-		/*
-		 * require DUCC_HOME 
-		 */
-		String ducc_home = Utils.findDuccHome();
-		if(ducc_home == null) {
-			duccMessageProcessor.err("missing required environment variable: DUCC_HOME");
-			rc.set(RC_FAILURE);
-			return rc.get();
-		}
-		/*
-		 * parser is not thread safe?
-		 */
-		synchronized(DuccUi.class) {
-			Options options = new Options();
-			addOptions(options);
-			CommandLineParser parser = new PosixParser();
-			CommandLine commandLine = parser.parse(options, args);
-			/*
-			 * give help & exit when requested
-			 */
-			if (commandLine.hasOption(DuccUiConstants.name_help)) {
-				help(options);
-				return rc.get();
-			}
-			if(commandLine.getOptions().length == 0) {
-				help(options);
-				return rc.get();
-			}
-//			/*
-//			 * detect duplicate options
-//			 */
-//			if (DuccUiUtilities.duplicate_options(duccMessageProcessor, commandLine)) {
-//				return 1;
-//			}
-			/*
-			 * timestamp
-			 */
-			if (commandLine.hasOption(DuccUiConstants.name_timestamp)) {
-				timestamp = true;
-			}
-			/*
-			 * verbosity
-			 */
-			if (commandLine.hasOption(DuccUiConstants.name_debug)) {
-				debug = true;
-			}
-			/*
-			 * cancel job enabled
-			 */
-			if (commandLine.hasOption(DuccUiConstants.name_monitor_cancel_job_on_interrupt)) {
-				cancel_job_on_interrupt.set(true);
-			}
-			/*
-			 * job id
-			 */
-			if (commandLine.hasOption(DuccUiConstants.name_job_id)) {
-				jobId = commandLine.getOptionValue(DuccUiConstants.name_job_id);
-			}
-			else {
-				HelpFormatter formatter = new HelpFormatter();
-				formatter.setWidth(110);
-				formatter.printHelp(DuccJobMonitor.class.getName(), options);
-				rc.set(RC_HELP);
-				return rc.get();
-			}
-		}
-		
-		main = Thread.currentThread();
-		
-		Thread killer = new Killer(main);
-		Runtime.getRuntime().addShutdownHook(killer);
-		
-		duccPropertiesResolver = DuccPropertiesResolver.getInstance();
-		
-		adjustWakeupInterval();
-		
-		boolean observer = true;
-		String urlString = getUrlString(jobId);
-		String lastMessage = "";
-		String thisMessage = "";
-		
-		StringBuffer message = new StringBuffer();
-		
-		message.append("id:"+jobId);
-		message.append(" ");
-		message.append("location:");
-		message.append(ManagementFactory.getRuntimeMXBean().getName());
-		info(message.toString());
-		
-		while(observer) {
-			
-			String json = getSingleLineStatus(urlString);
-			debug(json);
-			
-			if(json != null) {
-				Gson gson = new Gson();
-				MonitorInfo monitorInfo = gson.fromJson(json, MonitorInfo.class);
-
-				int stateCount = monitorInfo.stateSequence.size();
-				debug("states:"+stateCount);
-				if(stateCount <= 0) {
-					message = new StringBuffer();
-					message.append("id:"+jobId);
-					message.append(" ");
-					message.append("state:"+NotFound);
-					thisMessage = message.toString();
-					info(thisMessage);
-					message = new StringBuffer();
-					message.append("id:"+jobId);
-					message.append(" ");
-					message.append("rc:"+RC_FAILURE);
-					thisMessage = message.toString();
-					info(thisMessage);
-					rc.set(RC_FAILURE);
-					return rc.get();
-				}
-				
-				String state = "";
-				Iterator<String> states = monitorInfo.stateSequence.iterator();
-				while(states.hasNext()) {
-					state = states.next();
-				}
-				
-				message = new StringBuffer();
-				message.append("id:"+jobId);
-				message.append(" ");
-				message.append("state:"+state);
-				
-				if(state.equals(StateRunning)) {
-					message.append(details(monitorInfo));
-				}
-				else if(state.equals(StateCompleting)) {
-					cancel_job_on_interrupt.set(false);
-					message.append(details(monitorInfo));
-				}
-				else if(state.equals(StateCompleted)) {
-					cancel_job_on_interrupt.set(false);
-					message.append(details(monitorInfo));
-				}
-				
-				thisMessage = message.toString();
-				if(!thisMessage.equals(lastMessage)) {
-					info(thisMessage);
-					lastMessage = thisMessage;
-				}
-				
-				if(state.equals(StateCompleted)) {
-					if(monitorInfo.procs.equals("0")) {
-						if(monitorInfo.total.equals(monitorInfo.done)) {
-							message = new StringBuffer();
-							message.append("id:"+jobId);
-							message.append(" ");
-							message.append("rc:"+RC_SUCCESS);
-							thisMessage = message.toString();
-							info(thisMessage);
-							rc.set(RC_SUCCESS);
-							return rc.get();
-						}
-						else {
-							message = new StringBuffer();
-							message.append("id:"+jobId);
-							message.append(" ");
-							message.append("rc:"+RC_FAILURE);
-							thisMessage = message.toString();
-							info(thisMessage);
-							rc.set(RC_FAILURE);
-							return rc.get();
-						}
-					}
-				}
-			}
-			else {
-				error("error: timeout accessing "+urlString);
-			}
-
-			try {
-				Thread.sleep(wakeupInterval);
-			} catch (InterruptedException e) {
-				debug(e);
-			}
-		}
-		
-		return rc.get();
+		System.exit(code);
 	}
 	
-	private class Killer extends Thread {
-		
-		public Killer(Thread thread) {
-		}
-		
-		public void run() {
-			StringBuffer message = new StringBuffer();
-			if(cancel_job_on_interrupt.get()) {
-				message.append("killer: cancel");
-				cancel();
-			}
-			else {
-				message.append("killer: no cancel");
-			}
-			debug(message.toString());
-		}
+	@Override
+	public void help(Options options) {
+		HelpFormatter formatter = new HelpFormatter();
+		formatter.setWidth(DuccUiConstants.help_width);
+		formatter.printHelp(DuccJobMonitor.class.getName(), options);
+		return;
 	}
 	
+	@Override
 	public void cancel() {
-       	try {
+		try {
        		ArrayList<String> arrayList = new ArrayList<String>();
-       		arrayList.add("--"+DuccUiConstants.name_job_id);
-       		arrayList.add(jobId);
-       		arrayList.add("--"+DuccUiConstants.name_reason);
+       		arrayList.add("--"+UiOption.JobId);
+       		arrayList.add(getId());
+       		arrayList.add("--"+UiOption.Reason);
        		arrayList.add("\"submitter was terminated via interrupt\"");
        		String[] argList = arrayList.toArray(new String[0]);
-    		DuccJobCancel duccJobCancel = new DuccJobCancel(argList);
-    		boolean retVal = duccJobCancel.execute();
-    		if(retVal) {
-    		}
-    		else {
-    		}
+    		DuccJobCancel jobCancel = new DuccJobCancel(argList);
+    		boolean retVal = jobCancel.execute();
+    		debug("cancel rc:"+retVal);
     	} catch (Exception e) {
-    		duccMessageProcessor.exception(e);
+    		messageProcessor.exception(e);
     	}
 	}
-	
-	public int run(String[] args) {
-       	try {
-       		runInternal(args);
-    	} catch (Exception e) {
-    		duccMessageProcessor.exception(e);
-    	}
-       	return rc.get();
-	}
-	
-	public static void main(String[] args) {
-		try {
-			DuccJobMonitor duccJobMonitor = new DuccJobMonitor(false);
-			int rc = duccJobMonitor.run(args);
-            System.exit(rc == 0 ? 0 : 1);
-		} catch (Exception e) {
-			e.printStackTrace();
-            System.exit(1);
-		}
-		return;
-	}
 
+	@Override
+	public String getUrl(String id) {
+		String urlString = "http://"+getHost()+":"+getPort()+servlet+"?id="+id;
+		debug(urlString);
+		return urlString;
+	}
 }

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccJobSubmit.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccJobSubmit.java?rev=1458363&r1=1458362&r2=1458363&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccJobSubmit.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccJobSubmit.java Tue Mar 19 15:58:02 2013
@@ -23,6 +23,7 @@ import java.util.ArrayList;
 import java.util.Properties;
 
 import org.apache.uima.ducc.common.utils.DuccPropertiesResolver;
+import org.apache.uima.ducc.transport.event.IDuccContext.DuccContext;
 import org.apache.uima.ducc.transport.event.SubmitJobDuccEvent;
 import org.apache.uima.ducc.transport.event.SubmitJobReplyDuccEvent;
 import org.apache.uima.ducc.transport.event.cli.JobRequestProperties;
@@ -379,7 +380,7 @@ public class DuccJobSubmit 
 
         if ( rc ) {
             saveSpec("job-specification.properties", jobRequestProperties);
-            startMonitors(false);       // starts conditionally, based on job spec and console listener present
+            startMonitors(false, DuccContext.Job);       // starts conditionally, based on job spec and console listener present
         }
 
 		return rc;

Added: uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccManagedReservationCancel.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccManagedReservationCancel.java?rev=1458363&view=auto
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccManagedReservationCancel.java (added)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccManagedReservationCancel.java Tue Mar 19 15:58:02 2013
@@ -0,0 +1,138 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+*/
+package org.apache.uima.ducc.cli;
+
+import java.util.List;
+import java.util.Properties;
+
+import org.apache.uima.ducc.transport.event.CancelServiceDuccEvent;
+import org.apache.uima.ducc.transport.event.CancelServiceReplyDuccEvent;
+import org.apache.uima.ducc.transport.event.IDuccContext.DuccContext;
+import org.apache.uima.ducc.transport.event.cli.JobRequestProperties;
+
+public class DuccManagedReservationCancel extends CliBase {
+
+    JobRequestProperties requestProperties = new JobRequestProperties();
+    static String or_port = "ducc.orchestrator.http.port";
+    static String or_host = "ducc.orchestrator.node";
+
+    long canceledPid = -1;
+    String responseMessage = null;
+
+    UiOption[] opts = new UiOption []
+    {
+        UiOption.Help,
+        UiOption.Debug, 
+
+        UiOption.ManagedReservationId,
+        UiOption.Reason,  
+        UiOption.RoleAdministrator,
+    };
+
+	public DuccManagedReservationCancel(String [] args) 
+        throws Exception
+    {
+        init(this.getClass().getName(), opts, args, requestProperties, or_host, or_port, "or");
+	}
+
+	public DuccManagedReservationCancel(List<String> args) 
+        throws Exception
+    {
+        String[] arg_array = args.toArray(new String[args.size()]);
+        init(this.getClass().getName(), opts, arg_array, requestProperties, or_host, or_port, "or");
+	}
+
+	public DuccManagedReservationCancel(Properties props) 
+        throws Exception
+    {
+        for ( Object k : props.keySet() ) {      
+            Object v = props.get(k);
+            requestProperties.put(k, v);
+        }
+        init(this.getClass().getName(), opts, null, requestProperties, or_host, or_port, "or");
+	}
+
+	public String getResponseMessage()
+	{
+		return responseMessage;
+	}
+
+	public boolean execute() 
+        throws Exception 
+    {
+        CancelServiceDuccEvent      cancelServiceDuccEvent      = new CancelServiceDuccEvent(requestProperties, DuccContext.ManagedReservation);
+        CancelServiceReplyDuccEvent cancelServiceReplyDuccEvent = null;
+        try {
+            cancelServiceReplyDuccEvent = (CancelServiceReplyDuccEvent) dispatcher.dispatchAndWaitForDuccReply(cancelServiceDuccEvent);
+        } catch (Exception e) {
+            addError("Cancel not submitted: " + e.getMessage());
+            return false;
+        } finally {
+            dispatcher.close();
+        }
+			
+        /*
+         * process reply
+         */
+    	boolean rc = extractReply(cancelServiceReplyDuccEvent);            	
+    	responseMessage = cancelServiceReplyDuccEvent.getProperties().getProperty(UiOption.Message.pname());
+
+		return rc;
+	}
+	
+	public static void main(String[] args) {
+		try {
+			DuccManagedReservationCancel dsc = new DuccManagedReservationCancel(args);
+			boolean rc = dsc.execute();
+
+            // Fetch messages if any.  null means none
+            String [] messages = dsc.getMessages();
+            String [] warnings = dsc.getWarnings();
+            String [] errors   = dsc.getErrors();
+
+            if ( messages != null ) {
+                for (String s : messages ) {
+                    System.out.println(s);
+                }
+            }
+
+            if ( warnings != null ) {
+                for (String s : warnings ) {
+                    System.out.println("WARN: " + s);
+                }
+            }
+
+            if ( errors != null ) {
+                for (String s : errors ) {
+                    System.out.println("ERROR: " + s);
+                }
+            }
+
+            long id = dsc.getDuccId();
+            String msg = dsc.getResponseMessage();
+            String dtype = "Managed Reservation";
+            System.out.println(dtype + " " + id + " " + msg);
+            System.exit(rc ? 0 : 1);
+
+		} catch (Exception e) {
+            System.out.println("Cannot cancel: " + e.getMessage());
+            System.exit(1);
+		}
+	}
+}

Added: uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccManagedReservationMonitor.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccManagedReservationMonitor.java?rev=1458363&view=auto
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccManagedReservationMonitor.java (added)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccManagedReservationMonitor.java Tue Mar 19 15:58:02 2013
@@ -0,0 +1,89 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+*/
+package org.apache.uima.ducc.cli;
+
+import java.util.ArrayList;
+
+import org.apache.commons.cli.HelpFormatter;
+import org.apache.commons.cli.Options;
+import org.apache.uima.ducc.api.IDuccMessageProcessor;
+import org.apache.uima.ducc.cli.IUiOptions.UiOption;
+import org.apache.uima.ducc.transport.event.IDuccContext.DuccContext;
+
+public class DuccManagedReservationMonitor extends DuccMonitor implements IDuccMonitor {
+
+	public static String servlet = "/ducc-servlet/proxy-managed-reservation-status";
+	
+	protected DuccManagedReservationMonitor() {
+		super(DuccContext.ManagedReservation, true);
+	}
+	
+	protected DuccManagedReservationMonitor(IDuccMessageProcessor messageProcessor) {
+		super(DuccContext.ManagedReservation, true, messageProcessor);
+	}
+	
+	private DuccManagedReservationMonitor(boolean submit) {
+		super(DuccContext.ManagedReservation, submit);
+	}
+
+	public static void main(String[] args) {
+		int code = RC_FAILURE;
+		try {
+			DuccManagedReservationMonitor managedReservationMonitor = new DuccManagedReservationMonitor(false);
+			code = managedReservationMonitor.run(args);
+		} 
+		catch (Exception e) {
+			e.printStackTrace();
+		}
+		System.exit(code);
+	}
+	
+	@Override
+	public void help(Options options) {
+		HelpFormatter formatter = new HelpFormatter();
+		formatter.setWidth(DuccUiConstants.help_width);
+		formatter.printHelp(DuccManagedReservationMonitor.class.getName(), options);
+		return;
+	}
+	
+	@Override
+	public void cancel() {
+		try {
+       		ArrayList<String> arrayList = new ArrayList<String>();
+       		arrayList.add("--"+UiOption.ManagedReservationId.pname());
+       		arrayList.add(getId());
+       		arrayList.add("--"+UiOption.Reason.pname());
+       		arrayList.add("\"submitter was terminated via interrupt\"");
+       		String[] argList = arrayList.toArray(new String[0]);
+    		DuccManagedReservationCancel managedReservationCancel = new DuccManagedReservationCancel(argList);
+    		boolean retVal = managedReservationCancel.execute();
+    		debug("cancel rc:"+retVal);
+    	} catch (Exception e) {
+    		messageProcessor.exception(e);
+    	}
+	}
+
+	@Override
+	public String getUrl(String id) {
+		String urlString = "http://"+getHost()+":"+getPort()+servlet+"?id="+id;
+		debug(urlString);
+		return urlString;
+	}
+
+}

Added: uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccManagedReservationSubmit.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccManagedReservationSubmit.java?rev=1458363&view=auto
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccManagedReservationSubmit.java (added)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccManagedReservationSubmit.java Tue Mar 19 15:58:02 2013
@@ -0,0 +1,222 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+*/
+package org.apache.uima.ducc.cli;
+
+import java.util.ArrayList;
+import java.util.Properties;
+
+import org.apache.uima.ducc.transport.event.IDuccContext.DuccContext;
+import org.apache.uima.ducc.transport.event.SubmitServiceDuccEvent;
+import org.apache.uima.ducc.transport.event.SubmitServiceReplyDuccEvent;
+import org.apache.uima.ducc.transport.event.cli.ServiceRequestProperties;
+
+
+/**
+ * Submit a DUCC Managed Reservation
+ */
+
+public class DuccManagedReservationSubmit 
+    extends CliBase
+{
+    private static String dt = "Managed Reservation";
+    
+    private static String or_port = "ducc.orchestrator.http.port";
+    private static String or_host = "ducc.orchestrator.node";
+   
+    private ServiceRequestProperties serviceRequestProperties;
+
+    private UiOption[] opts = new UiOption[] {
+        UiOption.Help,
+        UiOption.Debug, 
+        UiOption.Description,
+        UiOption.LogDirectory,
+        UiOption.ProcessAttachConsole,
+        UiOption.ProcessEnvironment,
+        UiOption.ProcessExecutable,
+        UiOption.ProcessExecutableArgs,
+        UiOption.ProcessFailuresLimit,
+        UiOption.ProcessMemorySize,
+        UiOption.SchedulingClass,
+        UiOption.Specification,
+        UiOption.WorkingDirectory,
+        UiOption.WaitForCompletion,
+        UiOption.CancelManagedReservationOnInterrupt,
+    };
+
+
+    public DuccManagedReservationSubmit(String[] args)
+        throws Exception
+    {
+        this(args, null);
+    }
+        
+    public DuccManagedReservationSubmit(ArrayList<String> args)
+        throws Exception
+    {
+        this(args, null);
+    }
+        
+    public DuccManagedReservationSubmit(Properties props)
+        throws Exception
+    {
+        this(props, null);
+    }
+
+    public DuccManagedReservationSubmit(String[] args, IConsoleCallback consoleCb)
+        throws Exception
+    {
+        serviceRequestProperties = new ServiceRequestProperties();        
+        init(this.getClass().getName(), opts, args, serviceRequestProperties, or_host, or_port, "or", consoleCb);
+    }
+        
+    public DuccManagedReservationSubmit(ArrayList<String> args, IConsoleCallback consoleCb)
+        throws Exception
+    {
+        String[] arg_array = args.toArray(new String[args.size()]);
+        serviceRequestProperties = new ServiceRequestProperties();        
+        init(this.getClass().getName(), opts, arg_array, serviceRequestProperties, or_host, or_port, "or", consoleCb);
+    }
+        
+    public DuccManagedReservationSubmit(Properties props, IConsoleCallback consoleCb) 
+        throws Exception
+    {
+        serviceRequestProperties = new ServiceRequestProperties();
+        // TODO - can we get OR to just use properties and not these specialized classes?
+        //        Until then, we need to pass in the right kind of props, sigh.
+        for ( Object k : props.keySet() ) {      
+            Object v = props.get(k);
+            serviceRequestProperties.put(k, v);
+        }
+        init(this.getClass().getName(), opts, null, serviceRequestProperties, or_host, or_port, "or", consoleCb);
+    }
+
+                        
+    public boolean execute() throws Exception 
+    {
+
+        // These must be enforced for "ducclets"
+        serviceRequestProperties.setProperty(UiOption.ProcessThreadCount.pname(), "1");
+        serviceRequestProperties.setProperty(UiOption.ProcessDeploymentsMax.pname(), "1");     
+        serviceRequestProperties.put(UiOption.ServiceTypeOther.pname(), "");
+        
+        /*
+         * set DUCC_LD_LIBRARY_PATH in process environment
+         */
+        adjustLdLibraryPath(serviceRequestProperties, UiOption.ProcessEnvironment.pname());
+
+
+        SubmitServiceDuccEvent ev = new SubmitServiceDuccEvent(serviceRequestProperties);
+        SubmitServiceReplyDuccEvent reply = null;
+        
+        try {
+            reply = (SubmitServiceReplyDuccEvent) dispatcher.dispatchAndWaitForDuccReply(ev);
+        } catch (Exception e) {
+            addError(dt+" not submitted: " + e.getMessage());
+            return false;
+        } finally {
+            dispatcher.close();
+        }
+
+        /*
+         * process reply
+         */
+        boolean retval = true;
+        Properties properties = reply.getProperties();
+        @SuppressWarnings("unchecked")
+		ArrayList<String> or_warnings = (ArrayList<String>) properties.get(UiOption.SubmitWarnings.pname());
+        if (or_warnings != null) {
+            addWarnings(or_warnings);
+        }
+
+        @SuppressWarnings("unchecked")
+        ArrayList<String> or_errors = (ArrayList<String>) properties.get(UiOption.SubmitErrors.pname());
+        if(or_errors != null) {
+            addErrors(or_errors);
+            retval = false;
+        }
+
+        if ( retval ) {
+            String pid = reply.getProperties().getProperty(UiOption.JobId.pname());
+            if (pid == null ) {
+                retval = false;
+            } else {
+                friendlyId = Long.parseLong(pid);
+                if ( friendlyId < 0 ) {
+                    retval = false;
+                } else {
+                    saveSpec("process.properties", serviceRequestProperties);
+                    startMonitors(true, DuccContext.ManagedReservation);       // starts conditionally, based on job spec and console listener present
+                }
+            }
+        }
+
+        return retval;
+    }
+        
+    public static void main(String[] args) 
+    {
+        try {
+            // Instantiate the object with args similar to the CLI, or a pre-built properties file
+            DuccManagedReservationSubmit ds = new DuccManagedReservationSubmit(args);
+
+            // Run the API.  If process_attach_console was specified in the args, a console listener is
+            // started but this call does NOT block on it.
+            boolean rc = ds.execute();
+
+            // Fetch messages if any.  null means none
+            String [] messages = ds.getMessages();
+            String [] warnings = ds.getWarnings();
+            String [] errors   = ds.getErrors();
+
+            if ( messages != null ) {
+                for (String s : messages ) {
+                    System.out.println(s);
+                }
+            }
+
+            if ( warnings != null ) {
+                for (String s : warnings ) {
+                    System.out.println("WARN: " + s);
+                }
+            }
+
+            if ( errors != null ) {
+                for (String s : errors ) {
+                    System.out.println("ERROR: " + s);
+                }
+            }
+
+            // If the return is 'true' then as best the API can tell, the submit worked
+            if ( rc ) {
+                // Fetch the Ducc ID
+            	System.out.println(dt+" "+ds.getDuccId()+" submitted.");
+                ds.waitForCompletion();
+                System.out.println(dt+" return code: "+ds.getReturnCode());
+            	System.exit(0);
+            } else {
+                System.out.println("Could not submit "+dt);
+                System.exit(1);
+            }
+        } catch (Exception e) {
+            System.out.println("Cannot initialize: " + e.getMessage());
+            System.exit(1);
+        }
+    }
+    
+}

Added: uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccMonitor.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccMonitor.java?rev=1458363&view=auto
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccMonitor.java (added)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccMonitor.java Tue Mar 19 15:58:02 2013
@@ -0,0 +1,509 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+*/
+package org.apache.uima.ducc.cli;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.lang.management.ManagementFactory;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.Iterator;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.CommandLineParser;
+import org.apache.commons.cli.HelpFormatter;
+import org.apache.commons.cli.Option;
+import org.apache.commons.cli.OptionBuilder;
+import org.apache.commons.cli.Options;
+import org.apache.commons.cli.PosixParser;
+import org.apache.uima.ducc.api.DuccMessage;
+import org.apache.uima.ducc.api.IDuccMessageProcessor;
+import org.apache.uima.ducc.cli.IUiOptions.UiOption;
+import org.apache.uima.ducc.common.json.MonitorInfo;
+import org.apache.uima.ducc.common.utils.DuccPropertiesResolver;
+import org.apache.uima.ducc.common.utils.SynchronizedSimpleDateFormat;
+import org.apache.uima.ducc.common.utils.Utils;
+import org.apache.uima.ducc.transport.event.IDuccContext.DuccContext;
+
+import com.google.gson.Gson;
+
+public abstract class DuccMonitor  {
+
+	protected static final int RC_SUCCESS = 0;
+	protected static final int RC_FAILURE = 1;
+	protected static final int RC_HELP = RC_FAILURE;
+	
+	protected static final String NotFound = "NotFound";
+	protected static final String StateRunning = "Running";
+	protected static final String StateCompleting = "Completing";
+	protected static final String StateCompleted = "Completed";
+	
+	protected IDuccMessageProcessor messageProcessor = new DuccMessage();
+	
+	private Options options = new Options();
+	
+	private UiOption[] opts = new UiOption[0];
+    
+	private String id = null;
+	
+	private AtomicBoolean flag_cancel_on_interrupt = new AtomicBoolean(false);
+	private AtomicBoolean flag_debug = new AtomicBoolean(false);
+	private AtomicBoolean flag_error = new AtomicBoolean(true);
+	private AtomicBoolean flag_info = new AtomicBoolean(true);
+	private AtomicBoolean flag_trace = new AtomicBoolean(false);
+	private AtomicBoolean flag_timestamp = new AtomicBoolean(false);
+	
+	private AtomicBoolean flag_observer = new AtomicBoolean(true);
+	
+	private int milliseconds 	= 1;
+	private int seconds			= 1000*milliseconds;
+	private int wakeupInterval 	= 15*seconds;
+	private int urlTimeout 		= 1*60*seconds;
+	
+	private Thread main = null;
+	private DuccPropertiesResolver duccPropertiesResolver = null;
+	
+	private DuccContext context = null;
+	
+	private SynchronizedSimpleDateFormat sdf = new SynchronizedSimpleDateFormat("dd/MM/yyyy HH:mm:ss");
+	
+	private UiOption[] optsSubmitJob = new UiOption []
+    {
+        UiOption.Help,
+        UiOption.Debug, 
+        UiOption.Quiet, 
+        UiOption.Timestamp, 
+        UiOption.JobId,
+        UiOption.CancelJobOnInterrupt,
+    };
+    
+	private UiOption[] optsMonitorJob = new UiOption []
+    {
+        UiOption.Help,
+        UiOption.Debug, 
+        UiOption.Quiet, 
+        UiOption.Timestamp, 
+        UiOption.JobId,
+    };
+	
+	private UiOption[] optsSubmitManagedReservation = new UiOption []
+    {
+        UiOption.Help,
+        UiOption.Debug, 
+        UiOption.Quiet, 
+        UiOption.Timestamp, 
+        UiOption.ManagedReservationId,
+        UiOption.CancelManagedReservationOnInterrupt,
+    };
+	
+	private UiOption[] optsMonitorManagedReservation = new UiOption []
+    {
+        UiOption.Help,
+        UiOption.Debug, 
+        UiOption.Quiet, 
+        UiOption.Timestamp, 
+        UiOption.ManagedReservationId,
+    };
+	
+	protected DuccMonitor(DuccContext context, boolean submit) {
+		initialize(context, submit, null);
+	}
+	
+	protected DuccMonitor(DuccContext context, boolean submit, IDuccMessageProcessor messageProcessor) {
+		initialize(context, submit, messageProcessor);
+	}
+	
+	public abstract void help(Options options);
+	public abstract void cancel();
+	public abstract String getUrl(String id);
+	
+	public String getHost() {
+		String host = duccPropertiesResolver.getFileProperty("ducc.ws.node");
+		if(host == null) {
+			host = duccPropertiesResolver.getFileProperty("ducc.head");
+		}
+		return host;
+	}
+	
+	public String getPort() {
+		String port = duccPropertiesResolver.getFileProperty("ducc.ws.port");
+		return port;
+	}
+	
+	public String getId() {
+		return id;
+	}
+	
+	private void initialize(DuccContext context, boolean submit, IDuccMessageProcessor messageProcessor) {
+		// context
+		this.context = context;
+		// submit
+		if(context != null) {
+			switch(context) {
+			case Job:
+				if(submit) {
+					opts = optsSubmitJob;
+				}
+				else {
+					opts = optsMonitorJob;
+				}	
+				break;
+			case ManagedReservation:
+				if(submit) {
+					opts = optsSubmitManagedReservation;
+				}
+				else {
+					opts = optsMonitorManagedReservation;
+				}	
+				break;
+			default:
+				break;
+			}
+		}
+		options = makeOptions(opts,false);
+		// message processor
+		if(messageProcessor != null) {
+			this.messageProcessor = messageProcessor;
+		}
+	}
+	
+	protected Options makeOptions(UiOption[] optlist, boolean strict) {
+		Options opts = new Options();
+		for ( UiOption opt : optlist ) {
+			OptionBuilder.withDescription(opt.makeDesc());
+			OptionBuilder.withLongOpt   (opt.pname()); 
+			if ( opt.argname() == null ) { 
+				OptionBuilder.hasArg(false);
+			}
+			else {
+				OptionBuilder.withArgName(opt.argname());
+				if ( opt.multiargs() ) {
+					OptionBuilder.hasArgs();
+				}
+				else {
+					OptionBuilder.hasArgs(1);
+				}
+			}
+			if ( strict && opt.required() ) {
+				OptionBuilder.isRequired();
+			}
+			Option o = OptionBuilder.create();
+			opts.addOption(o);
+		}
+		return opts;
+	}
+	
+	protected void trace(String message) {
+		if(flag_trace.get()) {
+			messageProcessor.out(timestamp(message));
+		}
+	}
+	
+	protected void debug(String message) {
+		if(flag_debug.get()) {
+			messageProcessor.out(timestamp(message));
+		}
+	}
+	
+	protected void debug(Exception e) {
+		if(flag_debug.get()) {
+			messageProcessor.exception(e);
+		}
+	}
+	
+	private void info(String message) {
+		if(flag_info.get()) {
+			messageProcessor.out(timestamp(message));
+		}
+	}
+	
+	private void error(String message) {
+		if(flag_error.get()) {
+			messageProcessor.out(timestamp(message));
+		}
+	}
+	
+	protected String timestamp(String message) {
+		String tMessage = message;
+		if(flag_timestamp.get()) {
+			String date = sdf.format(new java.util.Date());
+			tMessage = date+" "+message;
+		}
+		return tMessage;
+	}
+	
+	private String details(MonitorInfo monitorInfo) {
+		StringBuffer sb = new StringBuffer();
+		switch(context) {
+		case Job:
+			sb.append(" ");
+			sb.append("total:");
+			sb.append(monitorInfo.total);
+			sb.append(" ");
+			sb.append("done:");
+			sb.append(monitorInfo.done);
+			sb.append(" ");
+			sb.append("error:");
+			sb.append(monitorInfo.error);
+			sb.append(" ");
+			sb.append("retry:");
+			sb.append(monitorInfo.retry);
+			sb.append(" ");
+			sb.append("procs:");
+			sb.append(monitorInfo.procs);
+			break;
+		}
+		return sb.toString();
+	}
+	
+	private void adjustWakeupInterval() {
+		String rate = duccPropertiesResolver.getFileProperty("ducc.orchestrator.state.publish.rate");
+		try {
+			wakeupInterval = Integer.parseInt(rate);
+		}
+		catch(Exception e) {
+			debug(e);
+		}
+	}
+	
+	private int runInternal(String[] args) throws Exception {
+		// DUCC_HOME
+		String ducc_home = Utils.findDuccHome();
+		if(ducc_home == null) {
+			messageProcessor.err("missing required environment variable: DUCC_HOME");
+			return RC_FAILURE;
+		}
+		// Ingest ducc.properties
+		duccPropertiesResolver = DuccPropertiesResolver.getInstance();
+		// Parse
+		synchronized(DuccMonitor.class) {
+			CommandLineParser parser = new PosixParser();
+			CommandLine commandLine = parser.parse(options, args);
+			if (commandLine.hasOption(DuccUiConstants.name_help)) {
+				help(options);
+				return RC_HELP;
+			}
+			if(commandLine.getOptions().length == 0) {
+				help(options);
+				return RC_HELP;
+			}
+			if (commandLine.hasOption(UiOption.Timestamp.pname())) {
+				flag_timestamp.set(true);
+			}
+			if (commandLine.hasOption(UiOption.Quiet.pname())) {
+				flag_info.set(false);
+				flag_error.set(false);
+			}
+			if (commandLine.hasOption(UiOption.Debug.pname())) {
+				flag_debug.set(true);
+			}
+			if (commandLine.hasOption(UiOption.CancelJobOnInterrupt.pname())) {
+				flag_cancel_on_interrupt.set(true);
+			}
+			if (commandLine.hasOption(UiOption.CancelManagedReservationOnInterrupt.pname())) {
+				flag_cancel_on_interrupt.set(true);
+			}
+			if (commandLine.hasOption(UiOption.JobId.pname())) {
+				id = commandLine.getOptionValue(UiOption.JobId.pname());
+			}
+			else if (commandLine.hasOption(UiOption.ManagedReservationId.pname())) {
+				id = commandLine.getOptionValue(UiOption.ManagedReservationId.pname());
+			}
+			else {
+				HelpFormatter formatter = new HelpFormatter();
+				formatter.setWidth(110);
+				formatter.printHelp(DuccJobMonitor.class.getName(), options);
+				return RC_HELP;
+			}
+		}
+		// Handle Ctl-C
+		main = Thread.currentThread();	
+		Thread killer = new Killer(main);
+		Runtime.getRuntime().addShutdownHook(killer);
+		// Setup polling
+		adjustWakeupInterval();
+		String urlString = getUrl(id);
+		String lastMessage = "";
+		String thisMessage = "";
+		StringBuffer message = new StringBuffer();
+		message.append("id:"+id);
+		message.append(" ");
+		message.append("location:");
+		message.append(ManagementFactory.getRuntimeMXBean().getName());
+		info(message.toString());
+		// Poll until finished
+		while(flag_observer.get()) {
+			String json = getSingleLineStatus(urlString);
+			if(json != null) {
+				debug(json);
+				Gson gson = new Gson();
+				MonitorInfo monitorInfo = gson.fromJson(json, MonitorInfo.class);
+				int stateCount = monitorInfo.stateSequence.size();
+				debug("states:"+stateCount);
+				if(stateCount <= 0) {
+					message = new StringBuffer();
+					message.append("id:"+id);
+					message.append(" ");
+					message.append("state:"+NotFound);
+					thisMessage = message.toString();
+					info(thisMessage);
+					message = new StringBuffer();
+					message.append("id:"+id);
+					message.append(" ");
+					message.append("rc:"+RC_FAILURE);
+					thisMessage = message.toString();
+					info(thisMessage);
+					return RC_FAILURE;
+				}
+				String state = "";
+				Iterator<String> states = monitorInfo.stateSequence.iterator();
+				while(states.hasNext()) {
+					state = states.next();
+					debug("list:"+state);
+				}
+				message = new StringBuffer();
+				message.append("id:"+id);
+				message.append(" ");
+				message.append("state:"+state);
+				if(state.equals(StateRunning)) {
+					message.append(details(monitorInfo));
+				}
+				else if(state.equals(StateCompleting)) {
+					flag_cancel_on_interrupt.set(false);
+					message.append(details(monitorInfo));
+				}
+				else if(state.equals(StateCompleted)) {
+					flag_cancel_on_interrupt.set(false);
+					message.append(details(monitorInfo));
+				}
+				thisMessage = message.toString();
+				if(!thisMessage.equals(lastMessage)) {
+					info(thisMessage);
+					lastMessage = thisMessage;
+				}
+				if(state.equals(StateCompleted)) {
+					if(monitorInfo.procs.equals("0")) {
+						if(monitorInfo.total.equals(monitorInfo.done)) {
+							message = new StringBuffer();
+							message.append("id:"+id);
+							message.append(" ");
+							message.append("rc:"+RC_SUCCESS);
+							thisMessage = message.toString();
+							info(thisMessage);
+							return RC_SUCCESS;
+						}
+						else {
+							message = new StringBuffer();
+							message.append("id:"+id);
+							message.append(" ");
+							message.append("rc:"+RC_FAILURE);
+							thisMessage = message.toString();
+							info(thisMessage);
+							return RC_SUCCESS;
+						}
+					}
+				}
+			}
+			else {
+				error("error: accessing "+urlString);
+			}
+			long start = System.currentTimeMillis();
+			long end = start;
+			while(!isTimeExpired(start,end,wakeupInterval)) {
+				if(!flag_observer.get()) {
+					break;
+				}
+				try {
+					Thread.sleep(wakeupInterval);
+				} 
+				catch (InterruptedException e) {
+					debug(e);
+				}
+				end = System.currentTimeMillis();
+			}
+			
+		}
+		return RC_SUCCESS;
+	}
+	
+	private boolean isTimeExpired(long start, long end, long interval) {
+		boolean retVal = false;
+		long diff = end - start;
+		if(diff >= interval) {
+			retVal = true;
+		}
+		trace("start:"+start+" "+"end:"+end+" "+"diff:"+diff+" "+"interval:"+interval+" "+"result:"+retVal);
+		return retVal;
+	}
+
+	private String getSingleLineStatus(String urlString) {
+		String line = null;
+		URL url = null;
+		try {
+		    url = new URL(urlString);
+		    URLConnection uc = url.openConnection();
+		    uc.setReadTimeout(urlTimeout); 
+		    BufferedReader br = new BufferedReader(new InputStreamReader(uc.getInputStream()));
+		    line = br.readLine();
+		    br.close();
+		} 
+		catch (MalformedURLException e) {
+		    e.printStackTrace();
+		}
+		catch(IOException e) {
+			e.printStackTrace();
+		} 
+		return line;
+	}
+	
+	private class Killer extends Thread {
+		
+		public Killer(Thread thread) {
+		}
+		
+		public void run() {
+			StringBuffer message = new StringBuffer();
+			if(flag_cancel_on_interrupt.get()) {
+				message.append("killer: cancel");
+				cancel();
+			}
+			else {
+				message.append("killer: no cancel");
+			}
+			debug(message.toString());
+			flag_observer.set(false);
+		}
+	}
+	
+	public int run(String[] args) {
+		int code = RC_FAILURE;
+       	try {
+       		code = runInternal(args);
+    	} 
+       	catch (Exception e) {
+    		messageProcessor.exception(e);
+    	}
+       	debug("rc="+code);
+       	return code;
+	}
+
+}

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccServiceCancel.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccServiceCancel.java?rev=1458363&r1=1458362&r2=1458363&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccServiceCancel.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccServiceCancel.java Tue Mar 19 15:58:02 2013
@@ -23,6 +23,7 @@ import java.util.Properties;
 
 import org.apache.uima.ducc.transport.event.CancelServiceDuccEvent;
 import org.apache.uima.ducc.transport.event.CancelServiceReplyDuccEvent;
+import org.apache.uima.ducc.transport.event.IDuccContext.DuccContext;
 import org.apache.uima.ducc.transport.event.cli.JobRequestProperties;
 
 /**
@@ -91,7 +92,7 @@ public class DuccServiceCancel 
         throws Exception 
     {
 
-        CancelServiceDuccEvent      cancelServiceDuccEvent      = new CancelServiceDuccEvent(requestProperties);
+        CancelServiceDuccEvent      cancelServiceDuccEvent      = new CancelServiceDuccEvent(requestProperties, DuccContext.Service);
         CancelServiceReplyDuccEvent cancelServiceReplyDuccEvent = null;
         try {
             cancelServiceReplyDuccEvent = (CancelServiceReplyDuccEvent) dispatcher.dispatchAndWaitForDuccReply(cancelServiceDuccEvent);

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccUiConstants.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccUiConstants.java?rev=1458363&r1=1458362&r2=1458363&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccUiConstants.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccUiConstants.java Tue Mar 19 15:58:02 2013
@@ -424,6 +424,28 @@ public class DuccUiConstants {
 	public static final String dval_monitor_cancel_job_on_interrupt = dval_submit_cancel_job_on_interrupt;
 	
 	/* 
+	 * submit Managed Reservation
+	 */
+	
+	public static final String name_submit_cancel_managed_reservation_on_interrupt = "cancel_managed_reservation_on_interrupt";
+	public static final String parm_submit_cancel_managed_reservation_on_interrupt = null;
+	public static final String desc_submit_cancel_managed_reservation_on_interrupt = "Cancel managed_reservation on interrupt (Ctrl-C); only possible when --"+name_wait_for_completion+" is also specified.";
+	public static final String labl_submit_cancel_managed_reservation_on_interrupt = null;
+	public static final String exmp_submit_cancel_managed_reservation_on_interrupt = null;
+	public static final String dval_submit_cancel_managed_reservation_on_interrupt = null;
+	
+	/* 
+	 * monitor Managed Reservation
+	 */
+	
+	public static final String name_monitor_cancel_managed_reservation_on_interrupt = name_submit_cancel_managed_reservation_on_interrupt;
+	public static final String parm_monitor_cancel_managed_reservation_on_interrupt = parm_submit_cancel_managed_reservation_on_interrupt;
+	public static final String desc_monitor_cancel_managed_reservation_on_interrupt = "Cancel managed_reservation on interrupt (Ctrl-C).";
+	public static final String labl_monitor_cancel_managed_reservation_on_interrupt = labl_submit_cancel_managed_reservation_on_interrupt;
+	public static final String exmp_monitor_cancel_managed_reservation_on_interrupt = exmp_submit_cancel_managed_reservation_on_interrupt;
+	public static final String dval_monitor_cancel_managed_reservation_on_interrupt = dval_submit_cancel_managed_reservation_on_interrupt;
+	
+	/* 
 	 * submit Service
 	 */
 	

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccletSubmit.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccletSubmit.java?rev=1458363&r1=1458362&r2=1458363&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccletSubmit.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccletSubmit.java Tue Mar 19 15:58:02 2013
@@ -21,6 +21,7 @@ package org.apache.uima.ducc.cli;
 import java.util.ArrayList;
 import java.util.Properties;
 
+import org.apache.uima.ducc.transport.event.IDuccContext.DuccContext;
 import org.apache.uima.ducc.transport.event.SubmitServiceDuccEvent;
 import org.apache.uima.ducc.transport.event.SubmitServiceReplyDuccEvent;
 import org.apache.uima.ducc.transport.event.cli.ServiceRequestProperties;
@@ -29,7 +30,7 @@ import org.apache.uima.ducc.transport.ev
 /**
  * Submit a DUCC service
  */
-
+@Deprecated
 public class DuccletSubmit 
     extends CliBase
 {
@@ -159,7 +160,7 @@ public class DuccletSubmit 
                     retval = false;
                 } else {
                     saveSpec("process.properties", serviceRequestProperties);
-                    startMonitors(true);       // starts conditionally, based on job spec and console listener present
+                    startMonitors(true, DuccContext.ManagedReservation);       // starts conditionally, based on job spec and console listener present
                 }
             }
         }

Added: uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/IDuccMonitor.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/IDuccMonitor.java?rev=1458363&view=auto
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/IDuccMonitor.java (added)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/IDuccMonitor.java Tue Mar 19 15:58:02 2013
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+*/
+package org.apache.uima.ducc.cli;
+
+import org.apache.commons.cli.Options;
+
+public interface IDuccMonitor {
+	
+	public void help(Options options);
+	public void cancel();
+	public String getUrl(String id);
+}

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/IUiOptions.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/IUiOptions.java?rev=1458363&r1=1458362&r2=1458363&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/IUiOptions.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/IUiOptions.java Tue Mar 19 15:58:02 2013
@@ -71,7 +71,7 @@ public interface IUiOptions
         CancelJobOnInterrupt { 
             public String pname()       { return "cancel_job_on_interrupt"; }
             public String argname()     { return null; }
-            public String description() { return "Cancel job on interrupt (Ctrl-C); only possible when --" + WaitForCompletion.pname() +" is also specified."; }
+            public String description() { return "Cancel job on interrupt (Ctrl-C)"; }
             public String example()     { return null; }
             public String deflt()       { return null; }
             public String label()       { return name(); }
@@ -79,6 +79,17 @@ public interface IUiOptions
             public boolean required()   { return false; }
         },            
 
+        CancelManagedReservationOnInterrupt { 
+            public String pname()       { return "cancel_managed_reservation_on_interrupt"; }
+            public String argname()     { return null; }
+            public String description() { return "Cancel managed reservation on interrupt (Ctrl-C)"; }
+            public String example()     { return null; }
+            public String deflt()       { return null; }
+            public String label()       { return name(); }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        }, 
+        
         ClasspathOrder { 
             public String pname()       { return JobSpecificationProperties.key_classpath_order; }
             public String argname()     { return ClasspathOrderParms.UserBeforeDucc.name() + " or " + ClasspathOrderParms.DuccBeforeUser.name(); }
@@ -244,6 +255,17 @@ public interface IUiOptions
             public boolean required()   { return true; }
         },            
 
+        ManagedReservationId { 
+            public String pname()       { return JobRequestProperties.key_id; }
+            public String argname()     { return "string"; }
+            public String description() { return "The id of the managed reservation"; }
+            public String example()     { return null; }
+            public String deflt()       { return null; }
+            public String label()       { return null; }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return true; }
+        },      
+        
         Jvm { 
             public String pname()       { return JobSpecificationProperties.key_jvm; }
             public String argname()     { return "path-name-to-java"; }
@@ -297,8 +319,19 @@ public interface IUiOptions
             public String label()       { return "Number of instances"; }
             public boolean multiargs()  { return false; }
             public boolean required()   { return false; }
-        },            
-
+        },  
+        
+        Quiet { 
+            public String pname()       { return "quiet"; }
+            public String argname()     { return null; }
+            public String description() { return "Disable CLI Informational messages."; }
+            public String example()     { return null; }
+            public String deflt()       { return null; }
+            public String label()       { return null; }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },  
+        
         Register    { 
             public String pname()       { return "register"; } 
             public String argname()     { return null; } 

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/MonitorListener.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/MonitorListener.java?rev=1458363&r1=1458362&r2=1458363&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/MonitorListener.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/MonitorListener.java Tue Mar 19 15:58:02 2013
@@ -23,6 +23,7 @@ import java.util.ArrayList;
 
 import org.apache.uima.ducc.cli.IUiOptions.UiOption;
 import org.apache.uima.ducc.common.utils.DuccProperties;
+import org.apache.uima.ducc.transport.event.IDuccContext.DuccContext;
 
 
 class MonitorListener
@@ -31,16 +32,16 @@ class MonitorListener
     CliBase        base  = null;
     long           jobid = 0;
     DuccProperties props = null;
-    boolean        quiet = false;
+    DuccContext    context = null;
+    
+    DuccMonitor monitor = null;
 
-    DuccJobMonitor monitor = null;
-
-    MonitorListener(CliBase base, long jobid, DuccProperties props, boolean quiet)
+    MonitorListener(CliBase base, long jobid, DuccProperties props, DuccContext context)
     {
-        this.base  = base;
+        this.base = base;
         this.jobid = jobid;
         this.props = props;
-        this.quiet = quiet;
+        this.context = context;
     }
 
     public void run()
@@ -55,6 +56,10 @@ class MonitorListener
                 arrayList.add("--" + UiOption.Debug.pname());
             }
 
+            if(props.containsKey(UiOption.Quiet.pname())) {
+                arrayList.add("--" + UiOption.Quiet.pname());
+            }
+            
             if(props.containsKey(DuccUiConstants.name_timestamp)) {
                 arrayList.add("--"+DuccUiConstants.name_timestamp);
             }
@@ -63,8 +68,19 @@ class MonitorListener
                 arrayList.add("--"+DuccUiConstants.name_monitor_cancel_job_on_interrupt);
             }
 
+            if(props.containsKey(DuccUiConstants.name_submit_cancel_managed_reservation_on_interrupt)) {
+                arrayList.add("--"+DuccUiConstants.name_monitor_cancel_managed_reservation_on_interrupt);
+            }
+            
             String[] argList = arrayList.toArray(new String[0]);
-            monitor = new DuccJobMonitor(quiet);
+            switch(context) {
+            case ManagedReservation:
+            	monitor = new DuccManagedReservationMonitor();
+            	break;
+            case Job:
+            	monitor = new DuccJobMonitor();
+            	break;
+            }
             retVal = monitor.run(argList);
         } catch (Exception e) {
             base.addMessage(e.getMessage());