1 /*- 2 * #%L 3 * Spring Stomp Server 4 * =============================================================== 5 * Copyright (C) 2020 Brabenetz Harald, Austria 6 * =============================================================== 7 * Licensed under the Apache License, Version 2.0 (the "License"); 8 * you may not use this file except in compliance with the License. 9 * You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, software 14 * distributed under the License is distributed on an "AS IS" BASIS, 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 * See the License for the specific language governing permissions and 17 * limitations under the License. 18 * #L% 19 */ 20 package net.brabenetz.app.springstompserver.config; 21 22 import org.springframework.boot.context.properties.ConfigurationProperties; 23 import org.springframework.stereotype.Component; 24 import org.springframework.web.socket.config.annotation.StompEndpointRegistry; 25 import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; 26 import org.springframework.web.socket.config.annotation.WebSocketTransportRegistration; 27 28 /** 29 * Additional Websocket Stomp Properties use in the {@link WebSocketConfig}. 30 */ 31 @Component 32 @ConfigurationProperties("spring-stomp-server") 33 @SuppressWarnings("PMD.DataClass") 34 public class WebSocketConfigProperties { 35 36 /** 37 * The Simple Message Broker destination prefixes which are handled by the WebSocket Stomp-Endpoint. 38 */ 39 private String[] destinationPrefixes = new String[] {"/topic", "/app", "/user"}; 40 41 /** 42 * The Websocket Endpoint which are handled by the {@link StompEndpointRegistry}. 43 * <p> 44 * Both variants with and without sockJs are supported. 45 */ 46 private String[] websocketEndpoints = new String[] {"/websocket"}; 47 48 /** 49 * The WebSocketTransportRegistration messageSizeLimit. Optional, The default value is 64K (i.e. 64 * 1024). 50 * 51 * @see WebSocketTransportRegistration#setMessageSizeLimit(int) 52 */ 53 private Integer messageSizeLimit; 54 55 /** 56 * The WebSocketTransportRegistration sendBufferSizeLimit. Optional, The default value is 512K (i.e. 512 * 1024). 57 * 58 * @see WebSocketTransportRegistration#setSendBufferSizeLimit(int) 59 */ 60 private Integer sendBufferSizeLimit; 61 62 /** 63 * The WebSocketTransportRegistration sendTimeLimit. Optional, The default value is 10 seconds (i.e. 10 * 10000). 64 * 65 * @see WebSocketTransportRegistration#setSendTimeLimit(int) 66 */ 67 private Integer sendTimeLimit; 68 69 /** 70 * The WebSocketTransportRegistration timeToFirstMessage. Optional, The default is set to 60,000 (1 minute). 71 * 72 * @see WebSocketTransportRegistration#setTimeToFirstMessage(int) 73 */ 74 private Integer timeToFirstMessage; 75 76 /** 77 * The activation of SocketJs: Set to true if a SockJs-Supported Endpoint should be registered. 78 * <p> 79 * Default is false, because nowadays (2020) all Browsers support Websockets natively. 80 * 81 * @see <a href="https://stomp-js.github.io/guide/stompjs/rx-stomp/ng2-stompjs/using-stomp-with-sockjs.html">StompJs: using-stomp-with-sockjs.html</a> 82 */ 83 private boolean withSockJs; 84 85 /** 86 * The cache limit to apply for registrations with the broker. 87 * <p> 88 * This is currently only applied for the destination cache in the subscription registry. The default cache limit there is 1024. 89 * <p> 90 * For performance-testing read https://programmersought.com/article/58855147686/ <br> 91 * ... There is a fatal weakness in SimpleBrokerMessageHandler ... <br> 92 * ... If the cache size exceeds the cacheLimit value, the original old The data is cleaned up, and when it is read again ... 93 */ 94 private int brokerRegistryCacheLimit = 1024; 95 96 /** 97 * The MessageChannel PoolSize used for incoming messages from WebSocket clients.<br> 98 * See {@link WebSocketMessageBrokerConfigurer#configureClientInboundChannel(org.springframework.messaging.simp.config.ChannelRegistration)} 99 * <p> 100 * By default the channel is backedby a thread pool of size 1. 101 */ 102 private int channelInboundCorePoolSize = 1; 103 104 /** 105 * The MessageChannel PoolSize used for outbound messages to WebSocket clients.<br> 106 * See {@link WebSocketMessageBrokerConfigurer#configureClientOutboundChannel(org.springframework.messaging.simp.config.ChannelRegistration)} 107 * <p> 108 * By default the channel is backed by a thread pool of size 1. 109 */ 110 private int channelOutboundCorePoolSize = 1; 111 112 /** 113 * The channel PoolSize used to send messages from the application to the message broker. 114 * <p> 115 * By default, messages from the application to the message broker are sent synchronously, which means application code sending a message will find out if 116 * the message cannot be sent through an exception. <br> 117 * However, this can be changed if the broker channel is configured here with task executor properties. 118 */ 119 private int channelBrokerCorePoolSize = 1; 120 121 /** 122 * Gets the Simple Message Broker destination prefixes which are handled by the WebSocket Stomp-Endpoint. 123 * 124 * @return the Simple Message Broker destination prefixes which are handled by the WebSocket Stomp-Endpoint 125 */ 126 public String[] getDestinationPrefixes() { 127 return destinationPrefixes; 128 } 129 130 /** 131 * Sets the Simple Message Broker destination prefixes which are handled by the WebSocket Stomp-Endpoint. 132 * 133 * @param destinationPrefixes the new Simple Message Broker destination prefixes which are handled by the WebSocket Stomp-Endpoint 134 */ 135 public void setDestinationPrefixes(final String... destinationPrefixes) { 136 this.destinationPrefixes = destinationPrefixes; 137 } 138 139 /** 140 * Gets the Websocket Endpoint which are handled by the {@link StompEndpointRegistry}. 141 * <p> 142 * Both variants with and without sockJs are supported. 143 * 144 * @return the Websocket Endpoint which are handled by the {@link StompEndpointRegistry} 145 */ 146 public String[] getWebsocketEndpoints() { 147 return websocketEndpoints; 148 } 149 150 /** 151 * Sets the Websocket Endpoint which are handled by the {@link StompEndpointRegistry}. 152 * <p> 153 * Both variants with and without sockJs are supported. 154 * 155 * @param websocketEndpoints the new Websocket Endpoint which are handled by the {@link StompEndpointRegistry} 156 */ 157 public void setWebsocketEndpoints(final String... websocketEndpoints) { 158 this.websocketEndpoints = websocketEndpoints; 159 } 160 161 /** 162 * Gets the WebSocketTransportRegistration messageSizeLimit. Optional, The default value is 64K (i.e. 64 * 1024). 163 * 164 * @return the WebSocketTransportRegistration messageSizeLimit 165 */ 166 public Integer getMessageSizeLimit() { 167 return messageSizeLimit; 168 } 169 170 /** 171 * Sets the WebSocketTransportRegistration messageSizeLimit. Optional, The default value is 64K (i.e. 64 * 1024). 172 * 173 * @param messageSizeLimit the new WebSocketTransportRegistration messageSizeLimit 174 */ 175 public void setMessageSizeLimit(Integer messageSizeLimit) { 176 this.messageSizeLimit = messageSizeLimit; 177 } 178 179 /** 180 * Gets the WebSocketTransportRegistration sendBufferSizeLimit. Optional, The default value is 512K (i.e. 512 * 1024). 181 * 182 * @return the WebSocketTransportRegistration sendBufferSizeLimit 183 */ 184 public Integer getSendBufferSizeLimit() { 185 return sendBufferSizeLimit; 186 } 187 188 /** 189 * Sets the WebSocketTransportRegistration sendBufferSizeLimit. Optional, The default value is 512K (i.e. 512 * 1024). 190 * 191 * @param sendBufferSizeLimit the new WebSocketTransportRegistration sendBufferSizeLimit 192 */ 193 public void setSendBufferSizeLimit(Integer sendBufferSizeLimit) { 194 this.sendBufferSizeLimit = sendBufferSizeLimit; 195 } 196 197 /** 198 * Gets the WebSocketTransportRegistration sendTimeLimit. Optional, The default value is 10 seconds (i.e. 10 * 10000). 199 * 200 * @return the WebSocketTransportRegistration sendTimeLimit 201 */ 202 public Integer getSendTimeLimit() { 203 return sendTimeLimit; 204 } 205 206 /** 207 * Sets the WebSocketTransportRegistration sendTimeLimit. Optional, The default value is 10 seconds (i.e. 10 * 10000). 208 * 209 * @param sendTimeLimit the new WebSocketTransportRegistration sendTimeLimit 210 */ 211 public void setSendTimeLimit(Integer sendTimeLimit) { 212 this.sendTimeLimit = sendTimeLimit; 213 } 214 215 /** 216 * Gets the WebSocketTransportRegistration timeToFirstMessage. Optional, The default is set to 60,000 (1 minute). 217 * 218 * @return the WebSocketTransportRegistration timeToFirstMessage 219 */ 220 public Integer getTimeToFirstMessage() { 221 return timeToFirstMessage; 222 } 223 224 /** 225 * Sets the WebSocketTransportRegistration timeToFirstMessage. Optional, The default is set to 60,000 (1 minute). 226 * 227 * @param timeToFirstMessage the new WebSocketTransportRegistration timeToFirstMessage 228 */ 229 public void setTimeToFirstMessage(Integer timeToFirstMessage) { 230 this.timeToFirstMessage = timeToFirstMessage; 231 } 232 233 /** 234 * Checks if is activation of SocketJs: Set to true if a SockJs-Supported Endpoint should be registered. 235 * <p> 236 * Default is false, because nowadays (2020) all Browsers support Websockets natively. 237 * 238 * @return the activation of SocketJs: Set to true if a SockJs-Supported Endpoint should be registered 239 */ 240 public boolean isWithSockJs() { 241 return withSockJs; 242 } 243 244 /** 245 * Sets the activation of SocketJs: Set to true if a SockJs-Supported Endpoint should be registered. 246 * <p> 247 * Default is false, because nowadays (2020) all Browsers support Websockets natively. 248 * 249 * @param withSockJs the new activation of SocketJs: Set to true if a SockJs-Supported Endpoint should be registered 250 */ 251 public void setWithSockJs(boolean withSockJs) { 252 this.withSockJs = withSockJs; 253 } 254 255 /** 256 * Gets the cache limit to apply for registrations with the broker. 257 * <p> 258 * This is currently only applied for the destination cache in the subscription registry. The default cache limit there is 1024. 259 * <p> 260 * For performance-testing read https://programmersought.com/article/58855147686/ <br> 261 * .. There is a fatal weakness in SimpleBrokerMessageHandler .. <br> 262 * .. If the cache size exceeds the cacheLimit value, the original old The data is cleaned up, and when it is read again .. 263 * 264 * @return the cache limit to apply for registrations with the broker 265 */ 266 public int getBrokerRegistryCacheLimit() { 267 return brokerRegistryCacheLimit; 268 } 269 270 /** 271 * Sets the cache limit to apply for registrations with the broker. 272 * <p> 273 * This is currently only applied for the destination cache in the subscription registry. The default cache limit there is 1024. 274 * <p> 275 * For performance-testing read https://programmersought.com/article/58855147686/ <br> 276 * .. There is a fatal weakness in SimpleBrokerMessageHandler .. <br> 277 * .. If the cache size exceeds the cacheLimit value, the original old The data is cleaned up, and when it is read again .. 278 * 279 * @param brokerRegistryCacheLimit the new cache limit to apply for registrations with the broker 280 */ 281 public void setBrokerRegistryCacheLimit(int brokerRegistryCacheLimit) { 282 this.brokerRegistryCacheLimit = brokerRegistryCacheLimit; 283 } 284 285 /** 286 * Gets the MessageChannel PoolSize used for incoming messages from WebSocket clients.<br> 287 * See {@link WebSocketMessageBrokerConfigurer#configureClientInboundChannel(org.springframework.messaging.simp.config.ChannelRegistration)} 288 * <p> 289 * By default the channel is backedby a thread pool of size 1. 290 * 291 * @return the MessageChannel PoolSize used for incoming messages from WebSocket clients 292 */ 293 public int getChannelInboundCorePoolSize() { 294 return channelInboundCorePoolSize; 295 } 296 297 /** 298 * Sets the MessageChannel PoolSize used for incoming messages from WebSocket clients.<br> 299 * See {@link WebSocketMessageBrokerConfigurer#configureClientInboundChannel(org.springframework.messaging.simp.config.ChannelRegistration)} 300 * <p> 301 * By default the channel is backedby a thread pool of size 1. 302 * 303 * @param channelInboundCorePoolSize the new MessageChannel PoolSize used for incoming messages from WebSocket clients 304 */ 305 public void setChannelInboundCorePoolSize(int channelInboundCorePoolSize) { 306 this.channelInboundCorePoolSize = channelInboundCorePoolSize; 307 } 308 309 /** 310 * Gets the MessageChannel PoolSize used for outbound messages to WebSocket clients.<br> 311 * See {@link WebSocketMessageBrokerConfigurer#configureClientOutboundChannel(org.springframework.messaging.simp.config.ChannelRegistration)} 312 * <p> 313 * By default the channel is backed by a thread pool of size 1. 314 * 315 * @return the MessageChannel PoolSize used for outbound messages to WebSocket clients 316 */ 317 public int getChannelOutboundCorePoolSize() { 318 return channelOutboundCorePoolSize; 319 } 320 321 /** 322 * Sets the MessageChannel PoolSize used for outbound messages to WebSocket clients.<br> 323 * See {@link WebSocketMessageBrokerConfigurer#configureClientOutboundChannel(org.springframework.messaging.simp.config.ChannelRegistration)} 324 * <p> 325 * By default the channel is backed by a thread pool of size 1. 326 * 327 * @param channelOutboundCorePoolSize the new MessageChannel PoolSize used for outbound messages to WebSocket clients 328 */ 329 public void setChannelOutboundCorePoolSize(int channelOutboundCorePoolSize) { 330 this.channelOutboundCorePoolSize = channelOutboundCorePoolSize; 331 } 332 333 /** 334 * Gets the channel PoolSize used to send messages from the application to the message broker. 335 * <p> 336 * By default, messages from the application to the message broker are sent synchronously, which means application code sending a message will find out if 337 * the message cannot be sent through an exception. <br> 338 * However, this can be changed if the broker channel is configured here with task executor properties. 339 * 340 * @return the channel PoolSize used to send messages from the application to the message broker 341 */ 342 public int getChannelBrokerCorePoolSize() { 343 return channelBrokerCorePoolSize; 344 } 345 346 /** 347 * Sets the channel PoolSize used to send messages from the application to the message broker. 348 * <p> 349 * By default, messages from the application to the message broker are sent synchronously, which means application code sending a message will find out if 350 * the message cannot be sent through an exception. <br> 351 * However, this can be changed if the broker channel is configured here with task executor properties. 352 * 353 * @param channelBrokerCorePoolSize the new channel PoolSize used to send messages from the application to the message broker 354 */ 355 public void setChannelBrokerCorePoolSize(int channelBrokerCorePoolSize) { 356 this.channelBrokerCorePoolSize = channelBrokerCorePoolSize; 357 } 358 359 }