This is an automated email from the ASF dual-hosted git repository. lukaszlenart pushed a commit to branch WW-5289-executor in repository https://gitbox.apache.org/repos/asf/struts.git
commit 1a3af1907a3d2401d75f82f9c875cb2c2ac4cccb Author: Lukasz Lenart <lukaszlen...@apache.org> AuthorDate: Sun Mar 26 14:11:10 2023 +0200 WW-5289 Fixes creating executor to avoid locking JVM on shutdown --- apps/showcase/src/main/resources/struts-wait.xml | 5 ++++- .../xwork2/config/providers/StrutsDefaultConfigurationProvider.java | 4 ++++ core/src/main/java/org/apache/struts2/StrutsConstants.java | 3 +++ .../java/org/apache/struts2/config/StrutsBeanSelectionProvider.java | 3 +++ .../org/apache/struts2/interceptor/ExecuteAndWaitInterceptor.java | 5 +++-- .../org/apache/struts2/interceptor/exec/StrutsExecutorProvider.java | 2 +- core/src/main/resources/struts-beans.xml | 3 +++ 7 files changed, 21 insertions(+), 4 deletions(-) diff --git a/apps/showcase/src/main/resources/struts-wait.xml b/apps/showcase/src/main/resources/struts-wait.xml index b237dac68..23784b91f 100644 --- a/apps/showcase/src/main/resources/struts-wait.xml +++ b/apps/showcase/src/main/resources/struts-wait.xml @@ -25,7 +25,10 @@ <struts> - <bean type="org.apache.struts2.interceptor.exec.ExecutorProvider" class="org.apache.struts2.showcase.wait.ThreadPoolExecutorProvider"/> + <bean type="org.apache.struts2.interceptor.exec.ExecutorProvider" name="threadPool" + class="org.apache.struts2.showcase.wait.ThreadPoolExecutorProvider"/> + + <constant name="struts.executor.provider" value="threadPool"/> <package name="wait" extends="struts-default" namespace="/wait"> <default-action-ref name="index"/> diff --git a/core/src/main/java/com/opensymphony/xwork2/config/providers/StrutsDefaultConfigurationProvider.java b/core/src/main/java/com/opensymphony/xwork2/config/providers/StrutsDefaultConfigurationProvider.java index 1f49cc11b..2c304ec82 100644 --- a/core/src/main/java/com/opensymphony/xwork2/config/providers/StrutsDefaultConfigurationProvider.java +++ b/core/src/main/java/com/opensymphony/xwork2/config/providers/StrutsDefaultConfigurationProvider.java @@ -118,6 +118,8 @@ import org.apache.struts2.conversion.StrutsTypeConverterCreator; import org.apache.struts2.conversion.StrutsTypeConverterHolder; import org.apache.struts2.dispatcher.HttpParameters; import org.apache.struts2.dispatcher.Parameter; +import org.apache.struts2.interceptor.exec.ExecutorProvider; +import org.apache.struts2.interceptor.exec.StrutsExecutorProvider; import org.apache.struts2.url.QueryStringBuilder; import org.apache.struts2.url.QueryStringParser; import org.apache.struts2.url.StrutsQueryStringBuilder; @@ -242,6 +244,8 @@ public class StrutsDefaultConfigurationProvider implements ConfigurationProvider .factory(QueryStringParser.class, StrutsQueryStringParser.class, Scope.SINGLETON) .factory(UrlEncoder.class, StrutsUrlEncoder.class, Scope.SINGLETON) .factory(UrlDecoder.class, StrutsUrlDecoder.class, Scope.SINGLETON) + + .factory(ExecutorProvider.class, StrutsExecutorProvider.class, Scope.SINGLETON) ; props.setProperty(StrutsConstants.STRUTS_ENABLE_DYNAMIC_METHOD_INVOCATION, Boolean.FALSE.toString()); diff --git a/core/src/main/java/org/apache/struts2/StrutsConstants.java b/core/src/main/java/org/apache/struts2/StrutsConstants.java index b6b5ca158..183c0aaf7 100644 --- a/core/src/main/java/org/apache/struts2/StrutsConstants.java +++ b/core/src/main/java/org/apache/struts2/StrutsConstants.java @@ -463,4 +463,7 @@ public final class StrutsConstants { /** A global flag to set property {@link org.apache.struts2.components.Checkbox#setSubmitUnchecked(String)} */ public static final String STRUTS_UI_CHECKBOX_SUBMIT_UNCHECKED = "struts.ui.checkbox.submitUnchecked"; + + /** See {@link org.apache.struts2.interceptor.exec.ExecutorProvider} */ + public static final String STRUTS_EXECUTOR_PROVIDER = "struts.executor.provider"; } diff --git a/core/src/main/java/org/apache/struts2/config/StrutsBeanSelectionProvider.java b/core/src/main/java/org/apache/struts2/config/StrutsBeanSelectionProvider.java index 06385f28f..c80494f35 100644 --- a/core/src/main/java/org/apache/struts2/config/StrutsBeanSelectionProvider.java +++ b/core/src/main/java/org/apache/struts2/config/StrutsBeanSelectionProvider.java @@ -66,6 +66,7 @@ import org.apache.struts2.dispatcher.DispatcherErrorHandler; import org.apache.struts2.dispatcher.StaticContentLoader; import org.apache.struts2.dispatcher.mapper.ActionMapper; import org.apache.struts2.dispatcher.multipart.MultiPartRequest; +import org.apache.struts2.interceptor.exec.ExecutorProvider; import org.apache.struts2.url.QueryStringBuilder; import org.apache.struts2.url.QueryStringParser; import org.apache.struts2.url.UrlDecoder; @@ -438,6 +439,8 @@ public class StrutsBeanSelectionProvider extends AbstractBeanSelectionProvider { alias(UrlEncoder.class, StrutsConstants.STRUTS_URL_ENCODER, builder, props, Scope.SINGLETON); alias(UrlDecoder.class, StrutsConstants.STRUTS_URL_DECODER, builder, props, Scope.SINGLETON); + alias(ExecutorProvider.class, StrutsConstants.STRUTS_EXECUTOR_PROVIDER, builder, props, Scope.SINGLETON); + switchDevMode(props); } diff --git a/core/src/main/java/org/apache/struts2/interceptor/ExecuteAndWaitInterceptor.java b/core/src/main/java/org/apache/struts2/interceptor/ExecuteAndWaitInterceptor.java index 4a5cb91b4..7a022c9cb 100644 --- a/core/src/main/java/org/apache/struts2/interceptor/ExecuteAndWaitInterceptor.java +++ b/core/src/main/java/org/apache/struts2/interceptor/ExecuteAndWaitInterceptor.java @@ -197,7 +197,7 @@ public class ExecuteAndWaitInterceptor extends MethodFilterInterceptor { this.container = container; } - @Inject(required = false) + @Inject public void setExecutorProvider(ExecutorProvider executorProvider) { this.executor = executorProvider; } @@ -387,7 +387,8 @@ public class ExecuteAndWaitInterceptor extends MethodFilterInterceptor { public void init() { super.init(); if (executor == null) { - executor = new StrutsExecutorProvider(); + LOG.debug("Using: {} as ExecutorProvider", StrutsExecutorProvider.class.getSimpleName()); + executor = container.getInstance(StrutsExecutorProvider.class); } } diff --git a/core/src/main/java/org/apache/struts2/interceptor/exec/StrutsExecutorProvider.java b/core/src/main/java/org/apache/struts2/interceptor/exec/StrutsExecutorProvider.java index 7370f318a..0e0ba966d 100644 --- a/core/src/main/java/org/apache/struts2/interceptor/exec/StrutsExecutorProvider.java +++ b/core/src/main/java/org/apache/struts2/interceptor/exec/StrutsExecutorProvider.java @@ -31,7 +31,7 @@ public class StrutsExecutorProvider implements ExecutorProvider { private final ExecutorService executor; public StrutsExecutorProvider() { - this.executor = Executors.newSingleThreadExecutor(); + this.executor = Executors.newFixedThreadPool(2); } @Override diff --git a/core/src/main/resources/struts-beans.xml b/core/src/main/resources/struts-beans.xml index eac1ff8be..7f98e4db5 100644 --- a/core/src/main/resources/struts-beans.xml +++ b/core/src/main/resources/struts-beans.xml @@ -245,4 +245,7 @@ <bean type="org.apache.struts2.url.UrlDecoder" name="strutsUrlDecoder" class="org.apache.struts2.url.StrutsUrlDecoder" scope="singleton"/> + <bean type="org.apache.struts2.interceptor.exec.ExecutorProvider" name="struts" + class="org.apache.struts2.interceptor.exec.StrutsExecutorProvider"/> + </struts>