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 <[email protected]>
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
[email protected].