1
1
/*
2
- * Copyright 2002-2020 the original author or authors.
2
+ * Copyright 2002-2022 the original author or authors.
3
3
*
4
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
5
* you may not use this file except in compliance with the License.
16
16
17
17
package org .springframework .web .socket .config .annotation ;
18
18
19
+ import org .springframework .beans .factory .DisposableBean ;
20
+ import org .springframework .beans .factory .InitializingBean ;
19
21
import org .springframework .context .annotation .Bean ;
20
22
import org .springframework .lang .Nullable ;
21
23
import org .springframework .scheduling .TaskScheduler ;
@@ -35,16 +37,13 @@ public class WebSocketConfigurationSupport {
35
37
@ Nullable
36
38
private ServletWebSocketHandlerRegistry handlerRegistry ;
37
39
38
- @ Nullable
39
- private TaskScheduler scheduler ;
40
-
41
40
42
41
@ Bean
43
- public HandlerMapping webSocketHandlerMapping (@ Nullable TaskScheduler defaultSockJsTaskScheduler ) {
42
+ public HandlerMapping webSocketHandlerMapping (DefaultSockJsSchedulerContainer schedulerContainer ) {
44
43
ServletWebSocketHandlerRegistry registry = initHandlerRegistry ();
45
44
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 " );
48
47
registry .setTaskScheduler (scheduler );
49
48
}
50
49
return registry .getHandlerMapping ();
@@ -62,8 +61,9 @@ protected void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
62
61
}
63
62
64
63
/**
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:
67
67
* <pre class="code">
68
68
* @Configuration
69
69
* @EnableWebSocket
@@ -80,16 +80,50 @@ protected void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
80
80
* </pre>
81
81
*/
82
82
@ 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
+ }
91
117
}
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
+
93
126
}
94
127
128
+
95
129
}
0 commit comments