diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/config/MessageBrokerBeanDefinitionParser.java b/spring-websocket/src/main/java/org/springframework/web/socket/config/MessageBrokerBeanDefinitionParser.java index 4bfc632782..c79df74ef9 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/config/MessageBrokerBeanDefinitionParser.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/config/MessageBrokerBeanDefinitionParser.java @@ -176,10 +176,15 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser { ParserContext parserCxt, Object source) { RootBeanDefinition executorDef = null; - - if (channelElement != null) { + if (channelElement == null) { + executorDef = getDefaultExecutorBeanDefinition(channelName); + } + else { Element executor = DomUtils.getChildElementByTagName(channelElement, "executor"); - if (executor != null) { + if (executor == null) { + executorDef = getDefaultExecutorBeanDefinition(channelName); + } + else { executorDef = new RootBeanDefinition(ThreadPoolTaskExecutor.class); String attrValue = executor.getAttribute("core-pool-size"); if (!StringUtils.isEmpty(attrValue)) { @@ -199,22 +204,16 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser { } } } - else if (!channelName.equals("brokerChannel")) { - executorDef = new RootBeanDefinition(ThreadPoolTaskExecutor.class); - executorDef.getPropertyValues().add("corePoolSize", Runtime.getRuntime().availableProcessors() * 2); - executorDef.getPropertyValues().add("maxPoolSize", Integer.MAX_VALUE); - executorDef.getPropertyValues().add("queueCapacity", Integer.MAX_VALUE); - } - ConstructorArgumentValues values = new ConstructorArgumentValues(); + ConstructorArgumentValues argValues = new ConstructorArgumentValues(); if (executorDef != null) { executorDef.getPropertyValues().add("threadNamePrefix", channelName + "-"); String executorName = channelName + "Executor"; registerBeanDefByName(executorName, executorDef, parserCxt, source); - values.addIndexedArgumentValue(0, new RuntimeBeanReference(executorName)); + argValues.addIndexedArgumentValue(0, new RuntimeBeanReference(executorName)); } - RootBeanDefinition channelDef = new RootBeanDefinition(ExecutorSubscribableChannel.class, values, null); + RootBeanDefinition channelDef = new RootBeanDefinition(ExecutorSubscribableChannel.class, argValues, null); if (channelElement != null) { Element interceptorsElement = DomUtils.getChildElementByTagName(channelElement, "interceptors"); @@ -226,6 +225,17 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser { return new RuntimeBeanReference(channelName); } + private RootBeanDefinition getDefaultExecutorBeanDefinition(String channelName) { + if (channelName.equals("brokerChannel")) { + return null; + } + RootBeanDefinition executorDef = new RootBeanDefinition(ThreadPoolTaskExecutor.class); + executorDef.getPropertyValues().add("corePoolSize", Runtime.getRuntime().availableProcessors() * 2); + executorDef.getPropertyValues().add("maxPoolSize", Integer.MAX_VALUE); + executorDef.getPropertyValues().add("queueCapacity", Integer.MAX_VALUE); + return executorDef; + } + private RuntimeBeanReference registerSubProtocolWebSocketHandler(Element element, RuntimeBeanReference clientInChannel, RuntimeBeanReference clientOutChannel, RuntimeBeanReference userSessionRegistry, ParserContext parserCxt, Object source) { diff --git a/spring-websocket/src/test/java/org/springframework/web/socket/config/MessageBrokerBeanDefinitionParserTests.java b/spring-websocket/src/test/java/org/springframework/web/socket/config/MessageBrokerBeanDefinitionParserTests.java index 632fe34101..1c9b295d97 100644 --- a/spring-websocket/src/test/java/org/springframework/web/socket/config/MessageBrokerBeanDefinitionParserTests.java +++ b/spring-websocket/src/test/java/org/springframework/web/socket/config/MessageBrokerBeanDefinitionParserTests.java @@ -293,6 +293,17 @@ public class MessageBrokerBeanDefinitionParserTests { testExecutor("brokerChannel", 102, 202, 602); } + // SPR-11623 + + @Test + public void customChannelsWithDefaultExecutor() { + loadBeanDefinitions("websocket-config-broker-customchannels-default-executor.xml"); + + testExecutor("clientInboundChannel", Runtime.getRuntime().availableProcessors() * 2, Integer.MAX_VALUE, 60); + testExecutor("clientOutboundChannel", Runtime.getRuntime().availableProcessors() * 2, Integer.MAX_VALUE, 60); + assertFalse(this.appContext.containsBean("brokerChannelExecutor")); + } + @Test public void messageConverters() { loadBeanDefinitions("websocket-config-broker-converters.xml"); diff --git a/spring-websocket/src/test/resources/org/springframework/web/socket/config/websocket-config-broker-customchannels-default-executor.xml b/spring-websocket/src/test/resources/org/springframework/web/socket/config/websocket-config-broker-customchannels-default-executor.xml new file mode 100644 index 0000000000..4c8de3eede --- /dev/null +++ b/spring-websocket/src/test/resources/org/springframework/web/socket/config/websocket-config-broker-customchannels-default-executor.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + +