Issue #5828 - allow HttpClient to be used with JavaxWebSocketClientContainerProvider

Signed-off-by: Lachlan Roberts <lachlan@webtide.com>
This commit is contained in:
Lachlan Roberts 2020-12-23 17:14:12 +11:00
parent 06df421b56
commit 7a72a6ac64
4 changed files with 27 additions and 18 deletions

View File

@ -64,6 +64,7 @@ public class WebSocketCoreClient extends ContainerLifeCycle
this.httpClient = httpClient; this.httpClient = httpClient;
this.components = webSocketComponents; this.components = webSocketComponents;
addBean(httpClient); addBean(httpClient);
addBean(webSocketComponents);
} }
public CompletableFuture<CoreSession> connect(FrameHandler frameHandler, URI wsUri) throws IOException public CompletableFuture<CoreSession> connect(FrameHandler frameHandler, URI wsUri) throws IOException

View File

@ -20,9 +20,9 @@ module org.eclipse.jetty.websocket.javax.client
exports org.eclipse.jetty.websocket.javax.client; exports org.eclipse.jetty.websocket.javax.client;
exports org.eclipse.jetty.websocket.javax.client.internal to org.eclipse.jetty.websocket.javax.server; 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.core.client;
requires org.eclipse.jetty.websocket.javax.common; requires org.eclipse.jetty.websocket.javax.common;
requires transitive org.eclipse.jetty.client;
requires transitive jetty.websocket.api; requires transitive jetty.websocket.api;
provides ContainerProvider with JavaxWebSocketClientContainerProvider; provides ContainerProvider with JavaxWebSocketClientContainerProvider;

View File

@ -16,6 +16,7 @@ package org.eclipse.jetty.websocket.javax.client;
import javax.websocket.ContainerProvider; import javax.websocket.ContainerProvider;
import javax.websocket.WebSocketContainer; import javax.websocket.WebSocketContainer;
import org.eclipse.jetty.client.HttpClient;
import org.eclipse.jetty.util.component.LifeCycle; import org.eclipse.jetty.util.component.LifeCycle;
import org.eclipse.jetty.util.thread.ShutdownThread; import org.eclipse.jetty.util.thread.ShutdownThread;
import org.eclipse.jetty.websocket.javax.client.internal.JavaxWebSocketClientContainer; import org.eclipse.jetty.websocket.javax.client.internal.JavaxWebSocketClientContainer;
@ -50,24 +51,36 @@ public class JavaxWebSocketClientContainerProvider extends ContainerProvider
* </p> * </p>
*/ */
@Override @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(); 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? // Register as JVM runtime shutdown hook?
ShutdownThread.register(clientContainer); ShutdownThread.register(container);
if (!clientContainer.isStarted()) if (!container.isStarted())
{ {
try try
{ {
clientContainer.start(); container.start();
} }
catch (Exception e) catch (Exception e)
{ {
@ -75,6 +88,6 @@ public class JavaxWebSocketClientContainerProvider extends ContainerProvider
} }
} }
return clientContainer; return container;
} }
} }

View File

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