in wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/AbstractWebSocketProcessor.java [234:314]
public final void broadcastMessage(final IWebSocketMessage message, IWebSocketConnection connection, boolean asynchronousPush, long timeout)
{
if (connection != null && (connection.isOpen() || isSpecialMessage(message)))
{
Application oldApplication = ThreadContext.getApplication();
Session oldSession = ThreadContext.getSession();
RequestCycle oldRequestCycle = ThreadContext.getRequestCycle();
WebResponse webResponse = webSocketSettings.newWebSocketResponse(connection, asynchronousPush, timeout);
try
{
WebSocketRequestMapper requestMapper = new WebSocketRequestMapper(application.getRootRequestMapper());
RequestCycle requestCycle = createRequestCycle(requestMapper, webResponse);
ThreadContext.setRequestCycle(requestCycle);
ThreadContext.setApplication(application);
Session session;
if (oldSession == null || message instanceof IWebSocketPushMessage)
{
ISessionStore sessionStore = application.getSessionStore();
session = sessionStore.lookup(webRequest);
ThreadContext.setSession(session);
}
else
{
session = oldSession;
}
if (session == null)
{
connectionRegistry.removeConnection(application, sessionId, connection.getKey());
LOG.debug("No Session could be found for session id '{}' and key '{}'!", sessionId, connection.getKey());
return;
}
IPageManager pageManager = session.getPageManager();
Page page = getPage(pageManager);
if (page != null)
{
WebSocketRequestHandler requestHandler = webSocketSettings.newWebSocketRequestHandler(page, connection);
WebSocketPayload<?> payload = createEventPayload(message, requestHandler);
if (!(message instanceof ConnectedMessage || isSpecialMessage(message))) {
requestCycle.scheduleRequestHandlerAfterCurrent(requestHandler);
}
IRequestHandler broadcastingHandler = new WebSocketMessageBroadcastHandler(pageId, resourceName, payload);
requestMapper.setHandler(broadcastingHandler);
requestCycle.processRequestAndDetach();
}
else
{
LOG.debug("Page with id '{}' has been expired. No message will be broadcast!", pageId);
}
}
catch (Exception x)
{
LOG.error("An error occurred during processing of a WebSocket message", x);
}
finally
{
try
{
webResponse.close();
}
finally
{
ThreadContext.setApplication(oldApplication);
ThreadContext.setRequestCycle(oldRequestCycle);
ThreadContext.setSession(oldSession);
}
}
}
else
{
LOG.debug("Either there is no connection({}) or it is closed.", connection);
}
}