|
|
|
@ -1,5 +1,5 @@ |
|
|
|
/* |
|
|
|
/* |
|
|
|
* Copyright 2002-2017 the original author or authors. |
|
|
|
* Copyright 2002-2018 the original author or authors. |
|
|
|
* |
|
|
|
* |
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
|
|
* you may not use this file except in compliance with the License. |
|
|
|
* you may not use this file except in compliance with the License. |
|
|
|
@ -16,14 +16,11 @@ |
|
|
|
|
|
|
|
|
|
|
|
package org.springframework.web.socket.config.annotation; |
|
|
|
package org.springframework.web.socket.config.annotation; |
|
|
|
|
|
|
|
|
|
|
|
import java.util.Date; |
|
|
|
|
|
|
|
import java.util.concurrent.ScheduledFuture; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import org.springframework.context.annotation.Bean; |
|
|
|
import org.springframework.context.annotation.Bean; |
|
|
|
import org.springframework.lang.Nullable; |
|
|
|
import org.springframework.lang.Nullable; |
|
|
|
import org.springframework.scheduling.TaskScheduler; |
|
|
|
import org.springframework.scheduling.TaskScheduler; |
|
|
|
import org.springframework.scheduling.Trigger; |
|
|
|
|
|
|
|
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; |
|
|
|
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; |
|
|
|
|
|
|
|
import org.springframework.util.Assert; |
|
|
|
import org.springframework.web.servlet.HandlerMapping; |
|
|
|
import org.springframework.web.servlet.HandlerMapping; |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
@ -45,7 +42,9 @@ public class WebSocketConfigurationSupport { |
|
|
|
public HandlerMapping webSocketHandlerMapping() { |
|
|
|
public HandlerMapping webSocketHandlerMapping() { |
|
|
|
ServletWebSocketHandlerRegistry registry = initHandlerRegistry(); |
|
|
|
ServletWebSocketHandlerRegistry registry = initHandlerRegistry(); |
|
|
|
if (registry.requiresTaskScheduler()) { |
|
|
|
if (registry.requiresTaskScheduler()) { |
|
|
|
registry.setTaskScheduler(initTaskScheduler()); |
|
|
|
TaskScheduler scheduler = defaultSockJsTaskScheduler(); |
|
|
|
|
|
|
|
Assert.notNull(scheduler, "Expected default TaskScheduler bean"); |
|
|
|
|
|
|
|
registry.setTaskScheduler(scheduler); |
|
|
|
} |
|
|
|
} |
|
|
|
return registry.getHandlerMapping(); |
|
|
|
return registry.getHandlerMapping(); |
|
|
|
} |
|
|
|
} |
|
|
|
@ -62,15 +61,17 @@ public class WebSocketConfigurationSupport { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* The default TaskScheduler to use if none is configured via |
|
|
|
* The default TaskScheduler to use if none is registered explicitly via |
|
|
|
* {@link SockJsServiceRegistration#setTaskScheduler}, i.e. |
|
|
|
* {@link SockJsServiceRegistration#setTaskScheduler}: |
|
|
|
* <pre class="code"> |
|
|
|
* <pre class="code"> |
|
|
|
* @Configuration |
|
|
|
* @Configuration |
|
|
|
* @EnableWebSocket |
|
|
|
* @EnableWebSocket |
|
|
|
* public class WebSocketConfig implements WebSocketConfigurer { |
|
|
|
* public class WebSocketConfig implements WebSocketConfigurer { |
|
|
|
* |
|
|
|
* |
|
|
|
* public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { |
|
|
|
* public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { |
|
|
|
* registry.addHandler(myWsHandler(), "/echo").withSockJS().setTaskScheduler(myScheduler()); |
|
|
|
* registry.addHandler(myHandler(), "/echo") |
|
|
|
|
|
|
|
* .withSockJS() |
|
|
|
|
|
|
|
* .setTaskScheduler(myScheduler()); |
|
|
|
* } |
|
|
|
* } |
|
|
|
* |
|
|
|
* |
|
|
|
* // ...
|
|
|
|
* // ...
|
|
|
|
@ -78,59 +79,16 @@ public class WebSocketConfigurationSupport { |
|
|
|
* </pre> |
|
|
|
* </pre> |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
@Bean |
|
|
|
@Bean |
|
|
|
|
|
|
|
@Nullable |
|
|
|
public TaskScheduler defaultSockJsTaskScheduler() { |
|
|
|
public TaskScheduler defaultSockJsTaskScheduler() { |
|
|
|
return initTaskScheduler(); |
|
|
|
if (initHandlerRegistry().requiresTaskScheduler()) { |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private TaskScheduler initTaskScheduler() { |
|
|
|
|
|
|
|
if (this.scheduler == null) { |
|
|
|
|
|
|
|
ServletWebSocketHandlerRegistry registry = initHandlerRegistry(); |
|
|
|
|
|
|
|
if (registry.requiresTaskScheduler()) { |
|
|
|
|
|
|
|
ThreadPoolTaskScheduler threadPoolScheduler = new ThreadPoolTaskScheduler(); |
|
|
|
ThreadPoolTaskScheduler threadPoolScheduler = new ThreadPoolTaskScheduler(); |
|
|
|
threadPoolScheduler.setThreadNamePrefix("SockJS-"); |
|
|
|
threadPoolScheduler.setThreadNamePrefix("SockJS-"); |
|
|
|
threadPoolScheduler.setPoolSize(Runtime.getRuntime().availableProcessors()); |
|
|
|
threadPoolScheduler.setPoolSize(Runtime.getRuntime().availableProcessors()); |
|
|
|
threadPoolScheduler.setRemoveOnCancelPolicy(true); |
|
|
|
threadPoolScheduler.setRemoveOnCancelPolicy(true); |
|
|
|
this.scheduler = threadPoolScheduler; |
|
|
|
this.scheduler = threadPoolScheduler; |
|
|
|
} |
|
|
|
} |
|
|
|
else { |
|
|
|
|
|
|
|
this.scheduler = new NoOpScheduler(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return this.scheduler; |
|
|
|
return this.scheduler; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static class NoOpScheduler implements TaskScheduler { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
|
|
@Nullable |
|
|
|
|
|
|
|
public ScheduledFuture<?> schedule(Runnable task, Trigger trigger) { |
|
|
|
|
|
|
|
throw new IllegalStateException("Unexpected use of scheduler."); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
|
|
public ScheduledFuture<?> schedule(Runnable task, Date startTime) { |
|
|
|
|
|
|
|
throw new IllegalStateException("Unexpected use of scheduler."); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
|
|
public ScheduledFuture<?> scheduleAtFixedRate(Runnable task, Date startTime, long period) { |
|
|
|
|
|
|
|
throw new IllegalStateException("Unexpected use of scheduler."); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
|
|
public ScheduledFuture<?> scheduleAtFixedRate(Runnable task, long period) { |
|
|
|
|
|
|
|
throw new IllegalStateException("Unexpected use of scheduler."); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
|
|
public ScheduledFuture<?> scheduleWithFixedDelay(Runnable task, Date startTime, long delay) { |
|
|
|
|
|
|
|
throw new IllegalStateException("Unexpected use of scheduler."); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
|
|
public ScheduledFuture<?> scheduleWithFixedDelay(Runnable task, long delay) { |
|
|
|
|
|
|
|
throw new IllegalStateException("Unexpected use of scheduler."); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|