Skip to content

Commit

Permalink
Issue #5828 - allow HttpClient to be used with JavaxWebSocketClientCo…
Browse files Browse the repository at this point in the history
…ntainerProvider

Signed-off-by: Lachlan Roberts <lachlan@webtide.com>
  • Loading branch information
lachlan-roberts committed Dec 23, 2020
1 parent 06df421 commit 7a72a6a
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 18 deletions.
Expand Up @@ -64,6 +64,7 @@ public WebSocketCoreClient(HttpClient httpClient, WebSocketComponents webSocketC
this.httpClient = httpClient;
this.components = webSocketComponents;
addBean(httpClient);
addBean(webSocketComponents);
}

public CompletableFuture<CoreSession> connect(FrameHandler frameHandler, URI wsUri) throws IOException
Expand Down
Expand Up @@ -20,9 +20,9 @@
exports org.eclipse.jetty.websocket.javax.client;
exports org.eclipse.jetty.websocket.javax.client.internal to org.eclipse.jetty.websocket.javax.server;

requires org.eclipse.jetty.client;
requires org.eclipse.jetty.websocket.core.client;
requires org.eclipse.jetty.websocket.javax.common;
requires transitive org.eclipse.jetty.client;
requires transitive jetty.websocket.api;

provides ContainerProvider with JavaxWebSocketClientContainerProvider;
Expand Down
Expand Up @@ -16,6 +16,7 @@
import javax.websocket.ContainerProvider;
import javax.websocket.WebSocketContainer;

import org.eclipse.jetty.client.HttpClient;
import org.eclipse.jetty.util.component.LifeCycle;
import org.eclipse.jetty.util.thread.ShutdownThread;
import org.eclipse.jetty.websocket.javax.client.internal.JavaxWebSocketClientContainer;
Expand Down Expand Up @@ -50,31 +51,43 @@ public static void stop(WebSocketContainer container) throws Exception
* </p>
*/
@Override
protected WebSocketContainer getContainer()
public WebSocketContainer getContainer()
{
// See: https://github.com/javaee/websocket-spec/issues/212
// TODO: on multiple executions, do we warn?
// TODO: do we care?
// TODO: on multiple executions, do we share bufferPool/executors/etc?
// TODO: do we want to provide a non-standard way to configure to always return the same clientContainer based on a config somewhere? (system.property?)

JavaxWebSocketClientContainer clientContainer = new JavaxWebSocketClientContainer();
registerShutdown(clientContainer);
return clientContainer;
}

/**
* Get a new instance of a client {@link WebSocketContainer} which uses a supplied {@link HttpClient}.
* @param httpClient a pre-configured {@link HttpClient} to be used by the implementation.
* @see #getContainer()
*/
public WebSocketContainer getContainer(HttpClient httpClient)
{
JavaxWebSocketClientContainer clientContainer = new JavaxWebSocketClientContainer(httpClient);
registerShutdown(clientContainer);
return clientContainer;
}

// See: https://github.com/eclipse-ee4j/websocket-api/issues/212
private WebSocketContainer registerShutdown(JavaxWebSocketClientContainer container)
{
// Register as JVM runtime shutdown hook?
ShutdownThread.register(clientContainer);
ShutdownThread.register(container);

if (!clientContainer.isStarted())
if (!container.isStarted())
{
try
{
clientContainer.start();
container.start();
}
catch (Exception e)
{
throw new RuntimeException("Unable to start Client Container", e);
}
}

return clientContainer;
return container;
}
}
Expand Up @@ -70,12 +70,7 @@ public JavaxWebSocketClientContainer()
*/
public JavaxWebSocketClientContainer(final HttpClient httpClient)
{
this(new WebSocketComponents(), (wsComponents) ->
{
WebSocketCoreClient coreClient = new WebSocketCoreClient(httpClient, wsComponents);
coreClient.getHttpClient().setName("Javax-WebSocketClient@" + Integer.toHexString(coreClient.getHttpClient().hashCode()));
return coreClient;
});
this(new WebSocketComponents(), (wsComponents) -> new WebSocketCoreClient(httpClient, wsComponents));
}

public JavaxWebSocketClientContainer(WebSocketComponents components)
Expand Down

0 comments on commit 7a72a6a

Please sign in to comment.