public class SubProtocolWebSocketHandler extends Object implements WebSocketHandler, SubProtocolCapable, MessageHandler, SmartLifecycle, ApplicationEventPublisherAware
WebSocketHandler
that delegates incoming WebSocket
messages to a SubProtocolHandler
along with a MessageChannel
to
which the sub-protocol handler can send messages from WebSocket clients to
the application.
Also an implementation of MessageHandler
that finds the WebSocket
session associated with the Message
and passes it, along with the message,
to the sub-protocol handler to send messages from the application back to the
client.
Constructor and Description |
---|
SubProtocolWebSocketHandler(MessageChannel clientInboundChannel,
SubscribableChannel clientOutboundChannel) |
Modifier and Type | Method and Description |
---|---|
void |
addProtocolHandler(SubProtocolHandler handler)
Register a sub-protocol handler.
|
void |
afterConnectionClosed(WebSocketSession session,
CloseStatus closeStatus)
Invoked after the WebSocket connection has been closed by either side, or after a
transport error has occurred.
|
void |
afterConnectionEstablished(WebSocketSession session)
Invoked after WebSocket negotiation has succeeded and the WebSocket connection is
opened and ready for use.
|
protected SubProtocolHandler |
findProtocolHandler(WebSocketSession session) |
SubProtocolHandler |
getDefaultProtocolHandler() |
int |
getPhase()
Return the phase value of this object.
|
Map<String,SubProtocolHandler> |
getProtocolHandlerMap()
Return the sub-protocols keyed by protocol name.
|
List<SubProtocolHandler> |
getProtocolHandlers() |
int |
getSendBufferSizeLimit() |
int |
getSendTimeLimit() |
List<String> |
getSubProtocols()
Return all supported protocols.
|
void |
handleMessage(Message<?> message)
Handle the given message.
|
void |
handleMessage(WebSocketSession session,
WebSocketMessage<?> message)
Invoked when a new WebSocket message arrives.
|
void |
handleTransportError(WebSocketSession session,
Throwable exception)
Handle an error from the underlying WebSocket message transport.
|
boolean |
isAutoStartup()
Return whether this Lifecycle component should be started automatically
by the container when the ApplicationContext is refreshed.
|
boolean |
isRunning()
Check whether this component is currently running.
|
void |
setApplicationEventPublisher(ApplicationEventPublisher eventPublisher)
Set the ApplicationEventPublisher that this object runs in.
|
void |
setDefaultProtocolHandler(SubProtocolHandler defaultProtocolHandler)
Set the
SubProtocolHandler to use when the client did not request a
sub-protocol. |
void |
setProtocolHandlers(List<SubProtocolHandler> protocolHandlers)
Configure one or more handlers to use depending on the sub-protocol requested by
the client in the WebSocket handshake request.
|
void |
setSendBufferSizeLimit(int sendBufferSizeLimit) |
void |
setSendTimeLimit(int sendTimeLimit) |
void |
start()
Start this component.
|
void |
stop()
Stop this component, typically in a synchronous fashion, such that
the component is fully stopped upon return of this method.
|
void |
stop(Runnable callback)
Indicates that a Lifecycle component must stop if it is currently running.
|
boolean |
supportsPartialMessages()
Whether the WebSocketHandler handles partial messages.
|
public SubProtocolWebSocketHandler(MessageChannel clientInboundChannel, SubscribableChannel clientOutboundChannel)
public void setProtocolHandlers(List<SubProtocolHandler> protocolHandlers)
protocolHandlers
- the sub-protocol handlers to usepublic List<SubProtocolHandler> getProtocolHandlers()
public void addProtocolHandler(SubProtocolHandler handler)
public Map<String,SubProtocolHandler> getProtocolHandlerMap()
public void setDefaultProtocolHandler(SubProtocolHandler defaultProtocolHandler)
SubProtocolHandler
to use when the client did not request a
sub-protocol.defaultProtocolHandler
- the default handlerpublic SubProtocolHandler getDefaultProtocolHandler()
public List<String> getSubProtocols()
getSubProtocols
in interface SubProtocolCapable
public void setSendTimeLimit(int sendTimeLimit)
public int getSendTimeLimit()
public void setSendBufferSizeLimit(int sendBufferSizeLimit)
public int getSendBufferSizeLimit()
public void setApplicationEventPublisher(ApplicationEventPublisher eventPublisher)
ApplicationEventPublisherAware
Invoked after population of normal bean properties but before an init callback like InitializingBean's afterPropertiesSet or a custom init-method. Invoked before ApplicationContextAware's setApplicationContext.
setApplicationEventPublisher
in interface ApplicationEventPublisherAware
eventPublisher
- event publisher to be used by this objectpublic boolean isAutoStartup()
SmartLifecycle
isAutoStartup
in interface SmartLifecycle
public int getPhase()
Phased
public final boolean isRunning()
Lifecycle
In the case of a container, this will return true
only if all components that apply are currently running.
public final void start()
Lifecycle
In the case of a container, this will propagate the start signal to all components that apply.
public final void stop()
Lifecycle
SmartLifecycle
and its stop(Runnable)
variant in cases where asynchronous stop behavior is necessary.
Should not throw an exception if the component isn't started yet.
In the case of a container, this will propagate the stop signal to all components that apply.
stop
in interface Lifecycle
SmartLifecycle.stop(Runnable)
public final void stop(Runnable callback)
SmartLifecycle
The provided callback is used by the LifecycleProcessor
to support an
ordered, and potentially concurrent, shutdown of all components having a
common shutdown order value. The callback must be executed after
the SmartLifecycle component does indeed stop.
The LifecycleProcessor
will call only this variant of the
stop
method; i.e. Lifecycle.stop()
will not be called for
SmartLifecycle
implementations unless explicitly delegated to within
this method.
stop
in interface SmartLifecycle
public void afterConnectionEstablished(WebSocketSession session) throws Exception
WebSocketHandler
afterConnectionEstablished
in interface WebSocketHandler
Exception
- this method can handle or propagate exceptions; see class-level
Javadoc for details.protected final SubProtocolHandler findProtocolHandler(WebSocketSession session)
public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception
WebSocketHandler
handleMessage
in interface WebSocketHandler
Exception
- this method can handle or propagate exceptions; see class-level
Javadoc for details.public void handleMessage(Message<?> message) throws MessagingException
MessageHandler
handleMessage
in interface MessageHandler
message
- the message to be handledMessagingException
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception
WebSocketHandler
handleTransportError
in interface WebSocketHandler
Exception
- this method can handle or propagate exceptions; see class-level
Javadoc for details.public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception
WebSocketHandler
afterConnectionClosed
in interface WebSocketHandler
Exception
- this method can handle or propagate exceptions; see class-level
Javadoc for details.public boolean supportsPartialMessages()
WebSocketHandler
true
and the underlying WebSocket server supports partial messages,
then a large WebSocket message, or one of an unknown size may be split and
maybe received over multiple calls to
WebSocketHandler.handleMessage(WebSocketSession, WebSocketMessage)
. The flag
WebSocketMessage.isLast()
indicates if
the message is partial and whether it is the last part.supportsPartialMessages
in interface WebSocketHandler