Skip to content

Commit 3d6e38b

Browse files
committed
Conditional registration of task scheduler for SockJS
Issue: SPR-16189
1 parent 6aa6d91 commit 3d6e38b

File tree

2 files changed

+21
-63
lines changed

2 files changed

+21
-63
lines changed

spring-websocket/src/main/java/org/springframework/web/socket/config/annotation/ServletWebSocketHandlerRegistry.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -100,16 +100,16 @@ protected boolean requiresTaskScheduler() {
100100
}
101101

102102
/**
103-
* Set a TaskScheduler is set on each SockJS registration that hasn't had one
104-
* registered explicitly. This method needs to be invoked prior to calling
105-
* {@link #getHandlerMapping()}.
103+
* Provide the TaskScheduler to use for SockJS endpoints for which a task
104+
* scheduler has not been explicitly registered. This method must be called
105+
* prior to {@link #getHandlerMapping()}.
106106
*/
107107
protected void setTaskScheduler(TaskScheduler scheduler) {
108108
this.registrations.stream()
109109
.map(ServletWebSocketHandlerRegistration::getSockJsServiceRegistration)
110110
.filter(Objects::nonNull)
111111
.filter(r -> r.getTaskScheduler() == null)
112-
.forEach(r -> r.setTaskScheduler(scheduler));
112+
.forEach(registration -> registration.setTaskScheduler(scheduler));
113113
}
114114

115115
public AbstractHandlerMapping getHandlerMapping() {
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2017 the original author or authors.
2+
* Copyright 2002-2018 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -16,14 +16,11 @@
1616

1717
package org.springframework.web.socket.config.annotation;
1818

19-
import java.util.Date;
20-
import java.util.concurrent.ScheduledFuture;
21-
2219
import org.springframework.context.annotation.Bean;
2320
import org.springframework.lang.Nullable;
2421
import org.springframework.scheduling.TaskScheduler;
25-
import org.springframework.scheduling.Trigger;
2622
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
23+
import org.springframework.util.Assert;
2724
import org.springframework.web.servlet.HandlerMapping;
2825

2926
/**
@@ -45,7 +42,9 @@ public class WebSocketConfigurationSupport {
4542
public HandlerMapping webSocketHandlerMapping() {
4643
ServletWebSocketHandlerRegistry registry = initHandlerRegistry();
4744
if (registry.requiresTaskScheduler()) {
48-
registry.setTaskScheduler(initTaskScheduler());
45+
TaskScheduler scheduler = defaultSockJsTaskScheduler();
46+
Assert.notNull(scheduler, "Expected default TaskScheduler bean");
47+
registry.setTaskScheduler(scheduler);
4948
}
5049
return registry.getHandlerMapping();
5150
}
@@ -62,75 +61,34 @@ protected void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
6261
}
6362

6463
/**
65-
* The default TaskScheduler to use if none is configured via
66-
* {@link SockJsServiceRegistration#setTaskScheduler}, i.e.
64+
* The default TaskScheduler to use if none is registered explicitly via
65+
* {@link SockJsServiceRegistration#setTaskScheduler}:
6766
* <pre class="code">
6867
* &#064;Configuration
6968
* &#064;EnableWebSocket
7069
* public class WebSocketConfig implements WebSocketConfigurer {
7170
*
7271
* public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
73-
* registry.addHandler(myWsHandler(), "/echo").withSockJS().setTaskScheduler(myScheduler());
72+
* registry.addHandler(myHandler(), "/echo")
73+
* .withSockJS()
74+
* .setTaskScheduler(myScheduler());
7475
* }
7576
*
7677
* // ...
7778
* }
7879
* </pre>
7980
*/
8081
@Bean
82+
@Nullable
8183
public TaskScheduler defaultSockJsTaskScheduler() {
82-
return initTaskScheduler();
83-
}
84-
85-
private TaskScheduler initTaskScheduler() {
86-
if (this.scheduler == null) {
87-
ServletWebSocketHandlerRegistry registry = initHandlerRegistry();
88-
if (registry.requiresTaskScheduler()) {
89-
ThreadPoolTaskScheduler threadPoolScheduler = new ThreadPoolTaskScheduler();
90-
threadPoolScheduler.setThreadNamePrefix("SockJS-");
91-
threadPoolScheduler.setPoolSize(Runtime.getRuntime().availableProcessors());
92-
threadPoolScheduler.setRemoveOnCancelPolicy(true);
93-
this.scheduler = threadPoolScheduler;
94-
}
95-
else {
96-
this.scheduler = new NoOpScheduler();
97-
}
84+
if (initHandlerRegistry().requiresTaskScheduler()) {
85+
ThreadPoolTaskScheduler threadPoolScheduler = new ThreadPoolTaskScheduler();
86+
threadPoolScheduler.setThreadNamePrefix("SockJS-");
87+
threadPoolScheduler.setPoolSize(Runtime.getRuntime().availableProcessors());
88+
threadPoolScheduler.setRemoveOnCancelPolicy(true);
89+
this.scheduler = threadPoolScheduler;
9890
}
9991
return this.scheduler;
10092
}
10193

102-
103-
private static class NoOpScheduler implements TaskScheduler {
104-
105-
@Override
106-
@Nullable
107-
public ScheduledFuture<?> schedule(Runnable task, Trigger trigger) {
108-
throw new IllegalStateException("Unexpected use of scheduler.");
109-
}
110-
111-
@Override
112-
public ScheduledFuture<?> schedule(Runnable task, Date startTime) {
113-
throw new IllegalStateException("Unexpected use of scheduler.");
114-
}
115-
116-
@Override
117-
public ScheduledFuture<?> scheduleAtFixedRate(Runnable task, Date startTime, long period) {
118-
throw new IllegalStateException("Unexpected use of scheduler.");
119-
}
120-
121-
@Override
122-
public ScheduledFuture<?> scheduleAtFixedRate(Runnable task, long period) {
123-
throw new IllegalStateException("Unexpected use of scheduler.");
124-
}
125-
126-
@Override
127-
public ScheduledFuture<?> scheduleWithFixedDelay(Runnable task, Date startTime, long delay) {
128-
throw new IllegalStateException("Unexpected use of scheduler.");
129-
}
130-
131-
@Override
132-
public ScheduledFuture<?> scheduleWithFixedDelay(Runnable task, long delay) {
133-
throw new IllegalStateException("Unexpected use of scheduler.");
134-
}
135-
}
13694
}

0 commit comments

Comments
 (0)