You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by sg...@apache.org on 2010/08/12 20:08:25 UTC
svn commit: r984885 - in
/commons/proper/exec/trunk/src/main/java/org/apache/commons/exec:
ExecuteStreamHandler.java PumpStreamHandler.java
Author: sgoeschl
Date: Thu Aug 12 18:08:25 2010
New Revision: 984885
URL: http://svn.apache.org/viewvc?rev=984885&view=rev
Log:
[EXEC-42] Applied the patch and updated documentation
Modified:
commons/proper/exec/trunk/src/main/java/org/apache/commons/exec/ExecuteStreamHandler.java
commons/proper/exec/trunk/src/main/java/org/apache/commons/exec/PumpStreamHandler.java
Modified: commons/proper/exec/trunk/src/main/java/org/apache/commons/exec/ExecuteStreamHandler.java
URL: http://svn.apache.org/viewvc/commons/proper/exec/trunk/src/main/java/org/apache/commons/exec/ExecuteStreamHandler.java?rev=984885&r1=984884&r2=984885&view=diff
==============================================================================
--- commons/proper/exec/trunk/src/main/java/org/apache/commons/exec/ExecuteStreamHandler.java (original)
+++ commons/proper/exec/trunk/src/main/java/org/apache/commons/exec/ExecuteStreamHandler.java Thu Aug 12 18:08:25 2010
@@ -60,6 +60,13 @@ public interface ExecuteStreamHandler {
/**
* Stop handling of the streams - will not be restarted.
+ * Will wait for pump threads to complete.
*/
void stop();
+
+ /**
+ * Stop handling of the streams - will not be restarted.
+ * @param join if true, wait for the pump threads to complete
+ */
+ void stop(boolean join);
}
Modified: commons/proper/exec/trunk/src/main/java/org/apache/commons/exec/PumpStreamHandler.java
URL: http://svn.apache.org/viewvc/commons/proper/exec/trunk/src/main/java/org/apache/commons/exec/PumpStreamHandler.java?rev=984885&r1=984884&r2=984885&view=diff
==============================================================================
--- commons/proper/exec/trunk/src/main/java/org/apache/commons/exec/PumpStreamHandler.java (original)
+++ commons/proper/exec/trunk/src/main/java/org/apache/commons/exec/PumpStreamHandler.java Thu Aug 12 18:08:25 2010
@@ -44,28 +44,29 @@ public class PumpStreamHandler implement
private final InputStream input;
private InputStreamPumper inputStreamPumper;
+
+ private boolean alwaysWaitForStreamThreads = true;
/**
* Construct a new <CODE>PumpStreamHandler</CODE>.
- *
- * @param out
- * the output <CODE>OutputStream</CODE>.
- * @param err
- * the error <CODE>OutputStream</CODE>.
- * @param input
- * the input <CODE>InputStream</CODE>.
*/
- public PumpStreamHandler(final OutputStream out, final OutputStream err,
- final InputStream input) {
-
- this.out = out;
- this.err = err;
- this.input = input;
+ public PumpStreamHandler() {
+ this(System.out, System.err);
}
/**
* Construct a new <CODE>PumpStreamHandler</CODE>.
- *
+ *
+ * @param outAndErr
+ * the output/error <CODE>OutputStream</CODE>.
+ */
+ public PumpStreamHandler(final OutputStream outAndErr) {
+ this(outAndErr, outAndErr);
+ }
+
+ /**
+ * Construct a new <CODE>PumpStreamHandler</CODE>.
+ *
* @param out
* the output <CODE>OutputStream</CODE>.
* @param err
@@ -78,18 +79,19 @@ public class PumpStreamHandler implement
/**
* Construct a new <CODE>PumpStreamHandler</CODE>.
*
- * @param outAndErr
- * the output/error <CODE>OutputStream</CODE>.
+ * @param out
+ * the output <CODE>OutputStream</CODE>.
+ * @param err
+ * the error <CODE>OutputStream</CODE>.
+ * @param input
+ * the input <CODE>InputStream</CODE>.
*/
- public PumpStreamHandler(final OutputStream outAndErr) {
- this(outAndErr, outAndErr);
- }
+ public PumpStreamHandler(final OutputStream out, final OutputStream err,
+ final InputStream input) {
- /**
- * Construct a new <CODE>PumpStreamHandler</CODE>.
- */
- public PumpStreamHandler() {
- this(System.out, System.err);
+ this.out = out;
+ this.err = err;
+ this.input = input;
}
/**
@@ -131,7 +133,8 @@ public class PumpStreamHandler implement
inputThread = createSystemInPump(input, os);
} else {
inputThread = createPump(input, os, true);
- } } else {
+ } }
+ else {
try {
os.close();
} catch (IOException e) {
@@ -140,8 +143,31 @@ public class PumpStreamHandler implement
}
}
}
+
+
+ /**
+ * Whether to always wait for (join) stream threads, even if the process
+ * is was "killed" by a Watchdog.
+ * @return true, to wait always (original behavior); false, to NOT wait if killed
+ */
+ public boolean isAlwaysWaitForStreamThreads() {
+ return alwaysWaitForStreamThreads;
+ }
/**
+ * Whether to always wait for (join) stream threads, even if the process
+ * is was "killed" by a Watchdog. Please note that skipping the wait might
+ * leave up to three threads behind so and cause severe problems in a
+ * production environment.
+ *
+ * @param alwaysWaitForStreamThreads if true, wait always (original behavior); if false, do NOT wait when killed
+ */
+ public void setAlwaysWaitForStreamThreads(boolean alwaysWaitForStreamThreads) {
+ this.alwaysWaitForStreamThreads = alwaysWaitForStreamThreads;
+ }
+
+
+ /**
* Start the <CODE>Thread</CODE>s.
*/
public void start() {
@@ -160,35 +186,60 @@ public class PumpStreamHandler implement
* Stop pumping the streams.
*/
public void stop() {
+ stop(this.alwaysWaitForStreamThreads);
+ }
- if (outputThread != null) {
- try {
- outputThread.join();
- outputThread = null;
- } catch (InterruptedException e) {
- // ignore
- }
+ /**
+ * Stop pumping the streams.
+ * @param join if true, wait for the pump threads to complete, if false don't wait
+ */
+ public void stop(boolean join) {
+
+ if (inputStreamPumper != null) {
+ inputStreamPumper.stopProcessing();
}
- if (errorThread != null) {
- try {
- errorThread.join();
- errorThread = null;
- } catch (InterruptedException e) {
- // ignore
+ if (join) {
+ if (outputThread != null) {
+ try {
+ outputThread.join();
+ outputThread = null;
+ } catch (InterruptedException e) {
+ // ignore
+ }
}
- }
- if (inputStreamPumper != null) {
- inputStreamPumper.stopProcessing();
+ if (errorThread != null) {
+ try {
+ errorThread.join();
+ errorThread = null;
+ } catch (InterruptedException e) {
+ // ignore
+ }
+ }
+
+ if (inputThread != null) {
+ try {
+ inputThread.join();
+ inputThread = null;
+ } catch (InterruptedException e) {
+ // ignore
+ }
+ }
}
+ else {
+ // well, give each thread a chance to terminate itself befoew
+ // we leave them alone
+ if (outputThread != null) {
+ outputThread.interrupt();
+ }
- if (inputThread != null) {
- try {
- inputThread.join();
- inputThread = null;
- } catch (InterruptedException e) {
- // ignore
+ if (errorThread != null) {
+ errorThread.interrupt();
+ }
+
+ if (inputThread != null) {
+ inputThread.interrupt();
}
}
@@ -299,4 +350,5 @@ public class PumpStreamHandler implement
result.setDaemon(true);
return result;
}
+
}