diff --git a/jetty-websocket/websocket-core-client/src/main/java/org/eclipse/jetty/websocket/core/client/WebSocketCoreClient.java b/jetty-websocket/websocket-core-client/src/main/java/org/eclipse/jetty/websocket/core/client/WebSocketCoreClient.java index cab076489d8..eabf31d5abe 100644 --- a/jetty-websocket/websocket-core-client/src/main/java/org/eclipse/jetty/websocket/core/client/WebSocketCoreClient.java +++ b/jetty-websocket/websocket-core-client/src/main/java/org/eclipse/jetty/websocket/core/client/WebSocketCoreClient.java @@ -64,6 +64,7 @@ public class WebSocketCoreClient extends ContainerLifeCycle this.httpClient = httpClient; this.components = webSocketComponents; addBean(httpClient); + addBean(webSocketComponents); } public CompletableFuture connect(FrameHandler frameHandler, URI wsUri) throws IOException diff --git a/jetty-websocket/websocket-javax-client/src/main/java/module-info.java b/jetty-websocket/websocket-javax-client/src/main/java/module-info.java index 54323eb068b..d6894b93269 100644 --- a/jetty-websocket/websocket-javax-client/src/main/java/module-info.java +++ b/jetty-websocket/websocket-javax-client/src/main/java/module-info.java @@ -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.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; diff --git a/jetty-websocket/websocket-javax-client/src/main/java/org/eclipse/jetty/websocket/javax/client/JavaxWebSocketClientContainerProvider.java b/jetty-websocket/websocket-javax-client/src/main/java/org/eclipse/jetty/websocket/javax/client/JavaxWebSocketClientContainerProvider.java index 3f00b215773..46e67ab95f2 100644 --- a/jetty-websocket/websocket-javax-client/src/main/java/org/eclipse/jetty/websocket/javax/client/JavaxWebSocketClientContainerProvider.java +++ b/jetty-websocket/websocket-javax-client/src/main/java/org/eclipse/jetty/websocket/javax/client/JavaxWebSocketClientContainerProvider.java @@ -16,6 +16,7 @@ package org.eclipse.jetty.websocket.javax.client; 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; @@ -50,24 +51,36 @@ public class JavaxWebSocketClientContainerProvider extends ContainerProvider *

*/ @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) { @@ -75,6 +88,6 @@ public class JavaxWebSocketClientContainerProvider extends ContainerProvider } } - return clientContainer; + return container; } } diff --git a/jetty-websocket/websocket-javax-client/src/main/java/org/eclipse/jetty/websocket/javax/client/internal/JavaxWebSocketClientContainer.java b/jetty-websocket/websocket-javax-client/src/main/java/org/eclipse/jetty/websocket/javax/client/internal/JavaxWebSocketClientContainer.java index c22f991e167..4f65bbd2c9e 100644 --- a/jetty-websocket/websocket-javax-client/src/main/java/org/eclipse/jetty/websocket/javax/client/internal/JavaxWebSocketClientContainer.java +++ b/jetty-websocket/websocket-javax-client/src/main/java/org/eclipse/jetty/websocket/javax/client/internal/JavaxWebSocketClientContainer.java @@ -70,12 +70,7 @@ public class JavaxWebSocketClientContainer extends JavaxWebSocketContainer imple */ 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)