Add support for removeOnCancelPolicy
This change removes the recently added SockJsThreadPoolTaskScheduler and instead builds support for the removeOnCancelPolicy property in ThreadPoolTaskScheduler and ScheduledExecutorFactoryBean. Issue: SPR-11918
This commit is contained in:
@@ -16,7 +16,7 @@
|
||||
|
||||
package org.springframework.web.socket.config;
|
||||
|
||||
import org.springframework.web.socket.sockjs.transport.SockJsThreadPoolTaskScheduler;
|
||||
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
|
||||
import org.w3c.dom.Element;
|
||||
|
||||
import org.springframework.beans.factory.config.BeanDefinition;
|
||||
@@ -135,11 +135,12 @@ class WebSocketNamespaceUtils {
|
||||
ParserContext parserContext, Object source) {
|
||||
|
||||
if (!parserContext.getRegistry().containsBeanDefinition(schedulerName)) {
|
||||
RootBeanDefinition taskSchedulerDef = new RootBeanDefinition(SockJsThreadPoolTaskScheduler.class);
|
||||
RootBeanDefinition taskSchedulerDef = new RootBeanDefinition(ThreadPoolTaskScheduler.class);
|
||||
taskSchedulerDef.setSource(source);
|
||||
taskSchedulerDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
|
||||
taskSchedulerDef.getPropertyValues().add("poolSize", Runtime.getRuntime().availableProcessors());
|
||||
taskSchedulerDef.getPropertyValues().add("threadNamePrefix", schedulerName + "-");
|
||||
taskSchedulerDef.getPropertyValues().add("removeOnCancelPolicy", true);
|
||||
parserContext.getRegistry().registerBeanDefinition(schedulerName, taskSchedulerDef);
|
||||
parserContext.registerComponent(new BeanComponentDefinition(taskSchedulerDef, schedulerName));
|
||||
}
|
||||
|
||||
@@ -19,8 +19,6 @@ package org.springframework.web.socket.config.annotation;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
|
||||
import org.springframework.web.servlet.HandlerMapping;
|
||||
import org.springframework.web.servlet.handler.AbstractHandlerMapping;
|
||||
import org.springframework.web.socket.sockjs.transport.SockJsThreadPoolTaskScheduler;
|
||||
|
||||
/**
|
||||
* Configuration support for WebSocket request handling.
|
||||
@@ -34,8 +32,7 @@ public class WebSocketConfigurationSupport {
|
||||
public HandlerMapping webSocketHandlerMapping() {
|
||||
ServletWebSocketHandlerRegistry registry = new ServletWebSocketHandlerRegistry(defaultSockJsTaskScheduler());
|
||||
registerWebSocketHandlers(registry);
|
||||
AbstractHandlerMapping hm = registry.getHandlerMapping();
|
||||
return hm;
|
||||
return registry.getHandlerMapping();
|
||||
}
|
||||
|
||||
protected void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
|
||||
@@ -60,8 +57,10 @@ public class WebSocketConfigurationSupport {
|
||||
*/
|
||||
@Bean
|
||||
public ThreadPoolTaskScheduler defaultSockJsTaskScheduler() {
|
||||
ThreadPoolTaskScheduler scheduler = new SockJsThreadPoolTaskScheduler();
|
||||
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
|
||||
scheduler.setThreadNamePrefix("SockJS-");
|
||||
scheduler.setPoolSize(Runtime.getRuntime().availableProcessors());
|
||||
scheduler.setRemoveOnCancelPolicy(true);
|
||||
return scheduler;
|
||||
}
|
||||
|
||||
|
||||
@@ -26,7 +26,6 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
|
||||
import org.springframework.web.servlet.HandlerMapping;
|
||||
import org.springframework.web.socket.WebSocketHandler;
|
||||
import org.springframework.web.socket.messaging.SubProtocolWebSocketHandler;
|
||||
import org.springframework.web.socket.sockjs.transport.SockJsThreadPoolTaskScheduler;
|
||||
|
||||
/**
|
||||
* Extends {@link AbstractMessageBrokerConfiguration} and adds configuration for
|
||||
@@ -96,8 +95,10 @@ public abstract class WebSocketMessageBrokerConfigurationSupport extends Abstrac
|
||||
*/
|
||||
@Bean
|
||||
public ThreadPoolTaskScheduler messageBrokerSockJsTaskScheduler() {
|
||||
ThreadPoolTaskScheduler scheduler = new SockJsThreadPoolTaskScheduler();
|
||||
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
|
||||
scheduler.setThreadNamePrefix("MessageBrokerSockJS-");
|
||||
scheduler.setPoolSize(Runtime.getRuntime().availableProcessors());
|
||||
scheduler.setRemoveOnCancelPolicy(true);
|
||||
return scheduler;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,66 +0,0 @@
|
||||
/*
|
||||
* Copyright 2002-2014 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.web.socket.sockjs.transport;
|
||||
|
||||
import org.springframework.lang.UsesJava7;
|
||||
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
|
||||
import org.springframework.util.ClassUtils;
|
||||
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.RejectedExecutionHandler;
|
||||
import java.util.concurrent.ScheduledThreadPoolExecutor;
|
||||
import java.util.concurrent.ThreadFactory;
|
||||
|
||||
/**
|
||||
* An extension of ThreadPoolTaskScheduler optimized for managing a large number
|
||||
* of task, e.g. setting he pool size to the number of available processors and
|
||||
* setting the setRemoveOnCancelPolicy property of
|
||||
* {@link java.util.concurrent.ScheduledThreadPoolExecutor} available in JDK 1.7
|
||||
* or higher in order to avoid keeping cancelled tasks around.
|
||||
*
|
||||
* @author Rossen Stoyanchev
|
||||
* @since 4.1
|
||||
*/
|
||||
@SuppressWarnings("serial")
|
||||
public class SockJsThreadPoolTaskScheduler extends ThreadPoolTaskScheduler {
|
||||
|
||||
// Check for setRemoveOnCancelPolicy method - available on JDK 7 and higher
|
||||
private static boolean hasRemoveOnCancelPolicyMethod = ClassUtils.hasMethod(
|
||||
ScheduledThreadPoolExecutor.class, "setRemoveOnCancelPolicy", boolean.class);
|
||||
|
||||
|
||||
public SockJsThreadPoolTaskScheduler() {
|
||||
setThreadNamePrefix("SockJS-");
|
||||
setPoolSize(Runtime.getRuntime().availableProcessors());
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected ExecutorService initializeExecutor(ThreadFactory factory, RejectedExecutionHandler handler) {
|
||||
ExecutorService service = super.initializeExecutor(factory, handler);
|
||||
configureRemoveOnCancelPolicy((ScheduledThreadPoolExecutor) service);
|
||||
return service;
|
||||
}
|
||||
|
||||
@UsesJava7 // guard setting removeOnCancelPolicy (safe with 1.6 due to hasRemoveOnCancelPolicyMethod check)
|
||||
private void configureRemoveOnCancelPolicy(ScheduledThreadPoolExecutor service) {
|
||||
if (hasRemoveOnCancelPolicyMethod) {
|
||||
service.setRemoveOnCancelPolicy(true);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -170,7 +170,7 @@ public class SubProtocolWebSocketHandlerTests {
|
||||
assertTrue(session1.isOpen());
|
||||
assertFalse(session2.isOpen());
|
||||
assertNull(session1.getCloseStatus());
|
||||
assertEquals(CloseStatus.PROTOCOL_ERROR, session2.getCloseStatus());
|
||||
assertEquals(CloseStatus.SESSION_NOT_RELIABLE, session2.getCloseStatus());
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user