Class ConcurrentWebSocketSessionDecorator
java.lang.Object
org.springframework.web.socket.handler.WebSocketSessionDecorator
org.springframework.web.socket.handler.ConcurrentWebSocketSessionDecorator
- All Implemented Interfaces:
Closeable,AutoCloseable,WebSocketSession
Wrap a
WebSocketSession
to guarantee only one thread can send messages at a time.
If a send is slow, subsequent attempts to send more messages from other threads will not be able to acquire the flush lock and messages will be buffered instead. At that time, the specified buffer-size limit and send-time limit will be checked and the session will be closed if the limits are exceeded.
- Since:
- 4.0.3
- Author:
- Rossen Stoyanchev, Juergen Hoeller
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic enumEnum for options of what to do when the buffer fills up. -
Constructor Summary
ConstructorsConstructorDescriptionConcurrentWebSocketSessionDecorator(WebSocketSession delegate, int sendTimeLimit, int bufferSizeLimit) Basic constructor.ConcurrentWebSocketSessionDecorator(WebSocketSession delegate, int sendTimeLimit, int bufferSizeLimit, ConcurrentWebSocketSessionDecorator.OverflowStrategy overflowStrategy) Constructor that also specifies the overflow strategy to use. -
Method Summary
Modifier and TypeMethodDescriptionvoidclose(CloseStatus status) Close the WebSocket connection with the given close status.intReturn the current buffer size (number of bytes).intReturn the configured buffer-size limit (number of bytes).intReturn the configured send-time limit (milliseconds).longReturn the time (milliseconds) since the current send started, or 0 if no send is currently in progress.voidsendMessage(WebSocketMessage<?> message) Send a WebSocket message: eitherTextMessageorBinaryMessage.voidsetMessageCallback(Consumer<WebSocketMessage<?>> callback) Set a callback invoked after a message is added to the send buffer.toString()Methods inherited from class org.springframework.web.socket.handler.WebSocketSessionDecorator
close, getAcceptedProtocol, getAttributes, getBinaryMessageSizeLimit, getDelegate, getExtensions, getHandshakeHeaders, getId, getLastSession, getLocalAddress, getPrincipal, getRemoteAddress, getTextMessageSizeLimit, getUri, isOpen, setBinaryMessageSizeLimit, setTextMessageSizeLimit, unwrap
-
Constructor Details
-
ConcurrentWebSocketSessionDecorator
public ConcurrentWebSocketSessionDecorator(WebSocketSession delegate, int sendTimeLimit, int bufferSizeLimit) Basic constructor.- Parameters:
delegate- theWebSocketSessionto delegate tosendTimeLimit- the send-time limit (milliseconds)bufferSizeLimit- the buffer-size limit (number of bytes)
-
ConcurrentWebSocketSessionDecorator
public ConcurrentWebSocketSessionDecorator(WebSocketSession delegate, int sendTimeLimit, int bufferSizeLimit, ConcurrentWebSocketSessionDecorator.OverflowStrategy overflowStrategy) Constructor that also specifies the overflow strategy to use.- Parameters:
delegate- theWebSocketSessionto delegate tosendTimeLimit- the send-time limit (milliseconds)bufferSizeLimit- the buffer-size limit (number of bytes)overflowStrategy- the overflow strategy to use; by default the session is terminated.- Since:
- 5.1
-
-
Method Details
-
getSendTimeLimit
public int getSendTimeLimit()Return the configured send-time limit (milliseconds).- Since:
- 4.3.13
-
getBufferSizeLimit
public int getBufferSizeLimit()Return the configured buffer-size limit (number of bytes).- Since:
- 4.3.13
-
getBufferSize
public int getBufferSize()Return the current buffer size (number of bytes). -
getTimeSinceSendStarted
public long getTimeSinceSendStarted()Return the time (milliseconds) since the current send started, or 0 if no send is currently in progress. -
setMessageCallback
Set a callback invoked after a message is added to the send buffer.- Parameters:
callback- the callback to invoke- Since:
- 5.3
-
sendMessage
Description copied from interface:WebSocketSessionSend a WebSocket message: eitherTextMessageorBinaryMessage.Note: The underlying standard WebSocket session (JSR-356) does not allow concurrent sending. Therefore sending must be synchronized. To ensure that, one option is to wrap the
WebSocketSessionwith theConcurrentWebSocketSessionDecorator.- Specified by:
sendMessagein interfaceWebSocketSession- Overrides:
sendMessagein classWebSocketSessionDecorator- Throws:
IOException- See Also:
-
close
Description copied from interface:WebSocketSessionClose the WebSocket connection with the given close status.- Specified by:
closein interfaceWebSocketSession- Overrides:
closein classWebSocketSessionDecorator- Throws:
IOException
-
toString
- Overrides:
toStringin classWebSocketSessionDecorator
-