public class ConcurrentWebSocketSessionDecorator extends WebSocketSessionDecorator
WebSocketSession
and guarantees
only one thread can send messages at a time.
If a send is slow, subsequent attempts to send more messages from a different thread will fail to acquire the flush lock and the messages will be buffered instead: At that time, the specified buffer-size limit and send-time limit will be checked and the session closed if the limits are exceeded.
Modifier and Type | Field and Description |
---|---|
private java.util.Queue<WebSocketMessage<?>> |
buffer |
private java.util.concurrent.atomic.AtomicInteger |
bufferSize |
private int |
bufferSizeLimit |
private java.util.concurrent.locks.Lock |
closeLock |
private java.util.concurrent.locks.Lock |
flushLock |
private boolean |
limitExceeded |
private static Log |
logger |
private long |
sendStartTime |
private int |
sendTimeLimit |
private boolean |
shutdownInProgress |
Constructor and Description |
---|
ConcurrentWebSocketSessionDecorator(WebSocketSession delegate,
int sendTimeLimit,
int bufferSizeLimit)
Create a new
ConcurrentWebSocketSessionDecorator . |
Modifier and Type | Method and Description |
---|---|
private void |
checkSessionLimits() |
void |
close(CloseStatus status)
Close the WebSocket connection with the given close status.
|
int |
getBufferSize() |
long |
getTimeSinceSendStarted() |
private boolean |
isDisabled() |
void |
sendMessage(WebSocketMessage<?> message)
Send a WebSocket message: either
TextMessage or BinaryMessage . |
private void |
sessionLimitReached(java.lang.String reason,
CloseStatus status) |
java.lang.String |
toString() |
private boolean |
tryFlushMessageBuffer() |
close, getAcceptedProtocol, getAttributes, getBinaryMessageSizeLimit, getDelegate, getExtensions, getHandshakeHeaders, getId, getLastSession, getLocalAddress, getPrincipal, getRemoteAddress, getTextMessageSizeLimit, getUri, isOpen, setBinaryMessageSizeLimit, setTextMessageSizeLimit, unwrap
private static final Log logger
private final java.util.Queue<WebSocketMessage<?>> buffer
private final java.util.concurrent.atomic.AtomicInteger bufferSize
private final int bufferSizeLimit
private volatile long sendStartTime
private final int sendTimeLimit
private volatile boolean limitExceeded
private volatile boolean shutdownInProgress
private final java.util.concurrent.locks.Lock flushLock
private final java.util.concurrent.locks.Lock closeLock
public ConcurrentWebSocketSessionDecorator(WebSocketSession delegate, int sendTimeLimit, int bufferSizeLimit)
ConcurrentWebSocketSessionDecorator
.delegate
- the WebSocketSession
to delegate tosendTimeLimit
- the send-time limit (milliseconds)bufferSizeLimit
- the buffer-size limit (number of bytes)public int getBufferSize()
public long getTimeSinceSendStarted()
public void sendMessage(WebSocketMessage<?> message) throws java.io.IOException
WebSocketSession
TextMessage
or BinaryMessage
.sendMessage
in interface WebSocketSession
sendMessage
in class WebSocketSessionDecorator
java.io.IOException
private boolean isDisabled()
private boolean tryFlushMessageBuffer() throws java.io.IOException
java.io.IOException
private void checkSessionLimits() throws java.io.IOException
java.io.IOException
private void sessionLimitReached(java.lang.String reason, CloseStatus status)
public void close(CloseStatus status) throws java.io.IOException
WebSocketSession
close
in interface WebSocketSession
close
in class WebSocketSessionDecorator
java.io.IOException
public java.lang.String toString()
toString
in class WebSocketSessionDecorator