Issue #1528 - Use WebSocketContainer out of current context
+ Interrogate ServletContext, ContextHandler, and Context for an active ServerContainer before returning a new ClientContainer
This commit is contained in:
parent
e001fe0355
commit
e3bab3df22
|
@ -18,6 +18,8 @@
|
||||||
|
|
||||||
package org.eclipse.jetty.websocket.jsr356;
|
package org.eclipse.jetty.websocket.jsr356;
|
||||||
|
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
import javax.websocket.ContainerProvider;
|
import javax.websocket.ContainerProvider;
|
||||||
import javax.websocket.WebSocketContainer;
|
import javax.websocket.WebSocketContainer;
|
||||||
|
|
||||||
|
@ -66,6 +68,20 @@ public class JettyClientContainerProvider extends ContainerProvider
|
||||||
{
|
{
|
||||||
synchronized (lock)
|
synchronized (lock)
|
||||||
{
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Class<?> clazzServerContainer = Class.forName("org.eclipse.jetty.websocket.jsr356.server.ServerContainer");
|
||||||
|
Method method = clazzServerContainer.getMethod("getWebSocketContainer");
|
||||||
|
WebSocketContainer container = (WebSocketContainer) method.invoke(null);
|
||||||
|
if (container != null)
|
||||||
|
{
|
||||||
|
return container;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Throwable ignore)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
if (INSTANCE == null)
|
if (INSTANCE == null)
|
||||||
{
|
{
|
||||||
INSTANCE = new ClientContainer();
|
INSTANCE = new ClientContainer();
|
||||||
|
|
|
@ -50,6 +50,28 @@ public class ServerContainer extends ClientContainer implements javax.websocket.
|
||||||
{
|
{
|
||||||
private static final Logger LOG = Log.getLogger(ServerContainer.class);
|
private static final Logger LOG = Log.getLogger(ServerContainer.class);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the WebSocketContainer out of the current ThreadLocal reference
|
||||||
|
* of the active ContextHandler.
|
||||||
|
*
|
||||||
|
* @return the WebSocketContainer if found, null if not found.
|
||||||
|
*/
|
||||||
|
public static WebSocketContainer getWebSocketContainer()
|
||||||
|
{
|
||||||
|
ContextHandler.Context context = ContextHandler.getCurrentContext();
|
||||||
|
if (context == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
ContextHandler handler = ContextHandler.getContextHandler(context);
|
||||||
|
if (handler == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
if (!(handler instanceof ServletContextHandler))
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return (javax.websocket.WebSocketContainer) handler.getServletContext().getAttribute("javax.websocket.server.ServerContainer");
|
||||||
|
}
|
||||||
|
|
||||||
private final NativeWebSocketConfiguration configuration;
|
private final NativeWebSocketConfiguration configuration;
|
||||||
private List<Class<?>> deferredEndpointClasses;
|
private List<Class<?>> deferredEndpointClasses;
|
||||||
private List<ServerEndpointConfig> deferredEndpointConfigs;
|
private List<ServerEndpointConfig> deferredEndpointConfigs;
|
||||||
|
|
|
@ -55,7 +55,6 @@ import org.eclipse.jetty.server.Server;
|
||||||
import org.eclipse.jetty.servlet.ServletContextHandler;
|
import org.eclipse.jetty.servlet.ServletContextHandler;
|
||||||
import org.eclipse.jetty.util.IO;
|
import org.eclipse.jetty.util.IO;
|
||||||
import org.eclipse.jetty.websocket.api.util.WSURI;
|
import org.eclipse.jetty.websocket.api.util.WSURI;
|
||||||
import org.eclipse.jetty.websocket.jsr356.ClientContainer;
|
|
||||||
import org.eclipse.jetty.websocket.jsr356.JettyClientContainerProvider;
|
import org.eclipse.jetty.websocket.jsr356.JettyClientContainerProvider;
|
||||||
import org.eclipse.jetty.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer;
|
import org.eclipse.jetty.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
|
@ -254,7 +253,7 @@ public class DelayedStartClientOnServerTest
|
||||||
assertThat("Response", response, startsWith("Connected to ws://"));
|
assertThat("Response", response, startsWith("Connected to ws://"));
|
||||||
List<String> threadNames = getThreadNames();
|
List<String> threadNames = getThreadNames();
|
||||||
assertNoHttpClientPoolThreads(threadNames);
|
assertNoHttpClientPoolThreads(threadNames);
|
||||||
assertThat("Threads", threadNames, hasItem(containsString("WebSocketContainer@")));
|
assertThat("Threads", threadNames, hasItem(containsString("WebSocketClient@")));
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
|
@ -301,7 +300,7 @@ public class DelayedStartClientOnServerTest
|
||||||
{
|
{
|
||||||
server.start();
|
server.start();
|
||||||
String response = GET(server.getURI().resolve("/configure"));
|
String response = GET(server.getURI().resolve("/configure"));
|
||||||
assertThat("Response", response, startsWith("Configured " + ClientContainer.class.getName()));
|
assertThat("Response", response, startsWith("Configured " + ServerContainer.class.getName()));
|
||||||
List<String> threadNames = getThreadNames();
|
List<String> threadNames = getThreadNames();
|
||||||
assertNoHttpClientPoolThreads(threadNames);
|
assertNoHttpClientPoolThreads(threadNames);
|
||||||
assertThat("Threads", threadNames, not(hasItem(containsString("WebSocketContainer@"))));
|
assertThat("Threads", threadNames, not(hasItem(containsString("WebSocketContainer@"))));
|
||||||
|
|
|
@ -43,7 +43,7 @@ public final class HttpClientProvider
|
||||||
}
|
}
|
||||||
catch (Throwable ignore)
|
catch (Throwable ignore)
|
||||||
{
|
{
|
||||||
Log.getLogger(HttpClientProvider.class).warn(ignore);
|
Log.getLogger(HttpClientProvider.class).ignore(ignore);
|
||||||
}
|
}
|
||||||
|
|
||||||
return DefaultHttpClientProvider.newHttpClient(scope);
|
return DefaultHttpClientProvider.newHttpClient(scope);
|
||||||
|
|
Loading…
Reference in New Issue