You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2018/04/25 03:28:15 UTC
[openmeetings] branch 4.0.x updated: [OPENMEETINGS-1878]
StreamWatcher is added back
This is an automated email from the ASF dual-hosted git repository.
solomax pushed a commit to branch 4.0.x
in repository https://gitbox.apache.org/repos/asf/openmeetings.git
The following commit(s) were added to refs/heads/4.0.x by this push:
new bc4666f [OPENMEETINGS-1878] StreamWatcher is added back
bc4666f is described below
commit bc4666f01a24193306cf8c00f84b5ac339f5e900
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Wed Apr 25 10:28:05 2018 +0700
[OPENMEETINGS-1878] StreamWatcher is added back
---
.../openmeetings/util/process/ProcessHelper.java | 54 ++++++++++++++++++++--
1 file changed, 49 insertions(+), 5 deletions(-)
diff --git a/openmeetings-util/src/main/java/org/apache/openmeetings/util/process/ProcessHelper.java b/openmeetings-util/src/main/java/org/apache/openmeetings/util/process/ProcessHelper.java
index ea406c3..cd3a3fb 100644
--- a/openmeetings-util/src/main/java/org/apache/openmeetings/util/process/ProcessHelper.java
+++ b/openmeetings-util/src/main/java/org/apache/openmeetings/util/process/ProcessHelper.java
@@ -21,11 +21,14 @@ package org.apache.openmeetings.util.process;
import static java.nio.charset.StandardCharsets.UTF_8;
import static org.apache.openmeetings.util.OpenmeetingsVariables.getExtProcessTtl;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
-import org.apache.commons.io.IOUtils;
import org.apache.openmeetings.util.OpenmeetingsVariables;
import org.red5.logging.Red5LoggerFactory;
import org.slf4j.Logger;
@@ -33,6 +36,40 @@ import org.slf4j.Logger;
public class ProcessHelper {
public static final Logger log = Red5LoggerFactory.getLogger(ProcessHelper.class, OpenmeetingsVariables.getWebAppRootKey());
+ // This is necessary to prevent 'buffer overflow'
+ // https://stackoverflow.com/questions/9885643/ffmpeg-executed-from-javas-processbuilder-does-not-return-under-windows-7
+ private static class StreamWatcher extends Thread {
+ public final StringBuilder output = new StringBuilder();
+ private final InputStream is;
+ private boolean run = true;
+
+ private StreamWatcher(final InputStream is) {
+ this.is = is;
+ }
+
+ @Override
+ public void run() {
+ try (BufferedReader br = new BufferedReader(new InputStreamReader(is, UTF_8));) {
+ String line = br.readLine();
+ while (run && line != null) {
+ output.append(line).append('\n');
+ line = br.readLine();
+ }
+ } catch (IOException ioexception) {
+ return;
+ }
+ }
+
+ public void finish() {
+ run = false;
+ }
+
+ @Override
+ public String toString() {
+ return output.toString();
+ }
+ }
+
private ProcessHelper() {}
private static String getCommand(String[] argv) {
@@ -72,9 +109,10 @@ public class ProcessHelper {
debugCommandStart(process, argv);
Process proc = null;
+ StreamWatcher errorWatcher = null;
+ StreamWatcher inputWatcher = null;
try {
- res.setCommand(getCommand(argv))
- .setOut("");
+ res.setCommand(getCommand(argv)).setOut("");
// By using the process Builder we have access to modify the
// environment variables
@@ -83,6 +121,10 @@ public class ProcessHelper {
pb.environment().putAll(env);
proc = pb.start();
+ errorWatcher = new StreamWatcher(proc.getErrorStream());
+ inputWatcher = new StreamWatcher(proc.getInputStream());
+ errorWatcher.start();
+ inputWatcher.start();
// 20-minute timeout for command execution
// FFMPEG conversion of Recordings may take a real long time until
@@ -90,8 +132,8 @@ public class ProcessHelper {
proc.waitFor(getExtProcessTtl(), TimeUnit.MINUTES);
res.setExitCode(proc.exitValue())
- .setOut(IOUtils.toString(proc.getInputStream(), UTF_8))
- .setError(IOUtils.toString(proc.getErrorStream(), UTF_8));
+ .setOut(inputWatcher.toString())
+ .setError(errorWatcher.toString());
} catch (Throwable t) {
log.error("executeScript", t);
res.setExitCode(-1)
@@ -99,6 +141,8 @@ public class ProcessHelper {
.setException(t.toString());
} finally {
if (proc != null) {
+ errorWatcher.finish();
+ inputWatcher.finish();
proc.destroy();
}
}
--
To stop receiving notification emails like this one, please contact
solomax@apache.org.