diff --git a/scm-webapp/src/main/java/sonia/scm/web/cgi/DefaultCGIExecutor.java b/scm-webapp/src/main/java/sonia/scm/web/cgi/DefaultCGIExecutor.java index 95d6ce2575..3eaa684080 100644 --- a/scm-webapp/src/main/java/sonia/scm/web/cgi/DefaultCGIExecutor.java +++ b/scm-webapp/src/main/java/sonia/scm/web/cgi/DefaultCGIExecutor.java @@ -58,6 +58,7 @@ import java.io.OutputStream; import java.util.Enumeration; import java.util.Map; +import java.util.concurrent.ExecutorService; import javax.servlet.ServletContext; import javax.servlet.ServletInputStream; @@ -94,15 +95,17 @@ public class DefaultCGIExecutor extends AbstractCGIExecutor * Constructs ... * * + * @param executor to handle error stream processing * @param configuration * @param context * @param request * @param response */ - public DefaultCGIExecutor(ScmConfiguration configuration, - ServletContext context, HttpServletRequest request, - HttpServletResponse response) + public DefaultCGIExecutor(ExecutorService executor, + ScmConfiguration configuration, ServletContext context, + HttpServletRequest request, HttpServletResponse response) { + this.executor = executor; this.configuration = configuration; this.context = context; this.request = request; @@ -507,7 +510,7 @@ public class DefaultCGIExecutor extends AbstractCGIExecutor */ private void processErrorStreamAsync(final Process process) { - new Thread(new Runnable() + executor.execute(new Runnable() { @Override public void run() @@ -528,7 +531,7 @@ public class DefaultCGIExecutor extends AbstractCGIExecutor IOUtil.close(errorStream); } } - }).start(); + }); } /** @@ -539,6 +542,8 @@ public class DefaultCGIExecutor extends AbstractCGIExecutor */ private void processServletInput(Process process) { + logger.trace("process servlet input"); + OutputStream processOS = null; ServletInputStream servletIS = null; @@ -637,6 +642,9 @@ public class DefaultCGIExecutor extends AbstractCGIExecutor //~--- fields --------------------------------------------------------------- + /** executor to handle error stream processing */ + private final ExecutorService executor; + /** Field description */ private ScmConfiguration configuration; diff --git a/scm-webapp/src/main/java/sonia/scm/web/cgi/DefaultCGIExecutorFactory.java b/scm-webapp/src/main/java/sonia/scm/web/cgi/DefaultCGIExecutorFactory.java index eaa89224e2..8da159f3c0 100644 --- a/scm-webapp/src/main/java/sonia/scm/web/cgi/DefaultCGIExecutorFactory.java +++ b/scm-webapp/src/main/java/sonia/scm/web/cgi/DefaultCGIExecutorFactory.java @@ -35,10 +35,15 @@ package sonia.scm.web.cgi; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.util.concurrent.ThreadFactoryBuilder; + import sonia.scm.config.ScmConfiguration; //~--- JDK imports ------------------------------------------------------------ +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -50,6 +55,21 @@ import javax.servlet.http.HttpServletResponse; public class DefaultCGIExecutorFactory implements CGIExecutorFactory { + /** + * Constructs ... + * + */ + public DefaultCGIExecutorFactory() + { + //J- + this.executor = Executors.newCachedThreadPool( + new ThreadFactoryBuilder().setNameFormat("cgi-pool-%d").build() + ); + //J+ + } + + //~--- methods -------------------------------------------------------------- + /** * Method description * @@ -63,10 +83,15 @@ public class DefaultCGIExecutorFactory implements CGIExecutorFactory */ @Override public CGIExecutor createExecutor(ScmConfiguration configuration, - ServletContext context, - HttpServletRequest request, - HttpServletResponse response) + ServletContext context, HttpServletRequest request, + HttpServletResponse response) { - return new DefaultCGIExecutor(configuration, context, request, response); + return new DefaultCGIExecutor(executor, configuration, context, request, + response); } + + //~--- fields --------------------------------------------------------------- + + /** Field description */ + private final ExecutorService executor; }