Skip to content

Commit 3682019

Browse files
committed
Hide default SockJS TaskScheduler for @EnableWebSocket
Closes gh-27903
1 parent d57bc17 commit 3682019

File tree

1 file changed

+52
-18
lines changed

1 file changed

+52
-18
lines changed

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

Lines changed: 52 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2020 the original author or authors.
2+
* Copyright 2002-2022 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,6 +16,8 @@
1616

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

19+
import org.springframework.beans.factory.DisposableBean;
20+
import org.springframework.beans.factory.InitializingBean;
1921
import org.springframework.context.annotation.Bean;
2022
import org.springframework.lang.Nullable;
2123
import org.springframework.scheduling.TaskScheduler;
@@ -35,16 +37,13 @@ public class WebSocketConfigurationSupport {
3537
@Nullable
3638
private ServletWebSocketHandlerRegistry handlerRegistry;
3739

38-
@Nullable
39-
private TaskScheduler scheduler;
40-
4140

4241
@Bean
43-
public HandlerMapping webSocketHandlerMapping(@Nullable TaskScheduler defaultSockJsTaskScheduler) {
42+
public HandlerMapping webSocketHandlerMapping(DefaultSockJsSchedulerContainer schedulerContainer) {
4443
ServletWebSocketHandlerRegistry registry = initHandlerRegistry();
4544
if (registry.requiresTaskScheduler()) {
46-
TaskScheduler scheduler = defaultSockJsTaskScheduler;
47-
Assert.notNull(scheduler, "Expected default TaskScheduler bean");
45+
TaskScheduler scheduler = schedulerContainer.getScheduler();
46+
Assert.notNull(scheduler, "TaskScheduler is required but not initialized");
4847
registry.setTaskScheduler(scheduler);
4948
}
5049
return registry.getHandlerMapping();
@@ -62,8 +61,9 @@ protected void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
6261
}
6362

6463
/**
65-
* The default TaskScheduler to use if none is registered explicitly via
66-
* {@link SockJsServiceRegistration#setTaskScheduler}:
64+
* A container of the default TaskScheduler to use if none was registered
65+
* explicitly via {@link SockJsServiceRegistration#setTaskScheduler} as
66+
* follows:
6767
* <pre class="code">
6868
* &#064;Configuration
6969
* &#064;EnableWebSocket
@@ -80,16 +80,50 @@ protected void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
8080
* </pre>
8181
*/
8282
@Bean
83-
@Nullable
84-
public TaskScheduler defaultSockJsTaskScheduler() {
85-
if (initHandlerRegistry().requiresTaskScheduler()) {
86-
ThreadPoolTaskScheduler threadPoolScheduler = new ThreadPoolTaskScheduler();
87-
threadPoolScheduler.setThreadNamePrefix("SockJS-");
88-
threadPoolScheduler.setPoolSize(Runtime.getRuntime().availableProcessors());
89-
threadPoolScheduler.setRemoveOnCancelPolicy(true);
90-
this.scheduler = threadPoolScheduler;
83+
public DefaultSockJsSchedulerContainer defaultSockJsSchedulerContainer() {
84+
return (initHandlerRegistry().requiresTaskScheduler() ?
85+
new DefaultSockJsSchedulerContainer(initDefaultSockJsScheduler()) :
86+
new DefaultSockJsSchedulerContainer(null));
87+
}
88+
89+
private ThreadPoolTaskScheduler initDefaultSockJsScheduler() {
90+
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
91+
scheduler.setThreadNamePrefix("SockJS-");
92+
scheduler.setPoolSize(Runtime.getRuntime().availableProcessors());
93+
scheduler.setRemoveOnCancelPolicy(true);
94+
return scheduler;
95+
}
96+
97+
98+
private static class DefaultSockJsSchedulerContainer implements InitializingBean, DisposableBean {
99+
100+
@Nullable
101+
private final ThreadPoolTaskScheduler scheduler;
102+
103+
DefaultSockJsSchedulerContainer(@Nullable ThreadPoolTaskScheduler scheduler) {
104+
this.scheduler = scheduler;
105+
}
106+
107+
@Nullable
108+
public ThreadPoolTaskScheduler getScheduler() {
109+
return this.scheduler;
110+
}
111+
112+
@Override
113+
public void afterPropertiesSet() throws Exception {
114+
if (this.scheduler != null) {
115+
this.scheduler.afterPropertiesSet();
116+
}
91117
}
92-
return this.scheduler;
118+
119+
@Override
120+
public void destroy() throws Exception {
121+
if (this.scheduler != null) {
122+
this.scheduler.destroy();
123+
}
124+
}
125+
93126
}
94127

128+
95129
}

0 commit comments

Comments
 (0)