Ryan Hermanson wrote:
I have had good luck with use of Undertow recently but now I’ve come
up
against a problem. When the deployment is strictly a server (I.e.
handling inbound requests over web sockets), all is happy. Recently,
there is a need to support outbound “client” sessions. And, all is not
well. I’ll be as detailed as possible to keep the speculation of
specifics to a minimum. Thanks for your patience.
My problem is two fold. The client session needs to have associated
sslContext (presumably thru EndpointConfig instance), as well as a way
to control/configure the underlying HTTP timeouts (presumably thru
socketOptions). When I do something as simple as
ContainerProvider.getWebSocketContainer().connectToServer(annotatedClientEndpoint.class,
path)
, the client connection is established with far-end as hoped, but the
sslContext defined for our undertow instance is not employed. To add to
the headache, if the remote server is unresponsive, the connection
attempt blocks for roughly 5 minutes. Neither of these scenarios is
ideal, obviously.
The ssl context can be set in three ways.
1) Use the version of connect that takes a ClientEndpointConfig and set
the io.undertow.websocket.SSL_CONTEXT property to the SSL context you
want to use (unfortunatly this won't work with annotated endpoints).
2) Call
io.undertow.websockets.jsr.DefaultWebSocketClientSslProvider#setSslContext()
which sets the thread local SSL context.
3) Implement io.undertow.websockets.jsr.WebsocketClientSslProvider and
add a META-INF/services entry pointing to your implementation.
(The web socket API is sadly lacking when it comes to configuring SSL).
ServerWebSocketContainer serverContainer = (ServerWebSocketContainer)
deployment.getDeployment()
.getServletContext().getAttribute(ServerContainer.class.getName());
serverContainer.connectToServer(annotatedClientEndpoint.class, path);
The above attempt to leverage the deployed ServerWebSocketContainer
(simpleAnnotatedServerEndpoint), successfully establishes the remote
connection, but any attempt at handling a message via @OnMessage (public
void onMessage(String msg)), yields NPE (BufferPool is null) with stack
trace of:
Make sure you set the buffer pool on the WebSocketDeploymentInfo
(io.undertow.websockets.jsr.WebSocketDeploymentInfo#setBuffers).
Stuart
2014-08-21 16:03:30,978;20667;DEBUG;core.request;(XNIO-1 I/O-1);Invoking
receive listener
2014-08-21 16:03:30,978;20667;ERROR;xnio.listener;(XNIO-1
I/O-1);XNIO001007: A channel event listener threw an exception
java.lang.NullPointerException
at
io.undertow.server.protocol.framed.AbstractFramedChannel.receive(AbstractFramedChannel.java:234)
at
io.undertow.websockets.core.AbstractReceiveListener.handleEvent(AbstractReceiveListener.java:20)
at
io.undertow.websockets.core.AbstractReceiveListener.handleEvent(AbstractReceiveListener.java:15)
at
org.xnio.ChannelListeners.invokeChannelListener(ChannelListeners.java:92)
at
io.undertow.server.protocol.framed.AbstractFramedChannel$FrameReadListener.handleEvent(AbstractFramedChannel.java:632)
at
io.undertow.server.protocol.framed.AbstractFramedChannel$FrameReadListener.handleEvent(AbstractFramedChannel.java:618)
at
org.xnio.ChannelListeners.invokeChannelListener(ChannelListeners.java:92)
at
org.xnio.conduits.ReadReadyHandler$ChannelListenerHandler.readReady(ReadReadyHandler.java:66)
at org.xnio.nio.NioSocketConduit.handleReady(NioSocketConduit.java:87)
at org.xnio.nio.WorkerThread.run(WorkerThread.java:539)
Based on description above and the relevant code snippets below, how
should I proceed in order to successfully establish outbound “client”
connection with functional xnioWorker instance, including SSL_CONTEXT
and working channels? Thank you for any suggestions.
Undertow version: 1.0.15 Final
Xnio version: 3.2.2 Final
My undertow instance:
undertow = Undertow.builder()
.addHttpListener(wsDefaultPort, WS_HOST)
.addHttpsListener(wssDefaultPort, WS_HOST,
MySSLSocketFactory.getSslContext())
.setHandler(rootPath)
.build();
undertow.start();
….
final WebSocketDeploymentInfo deployment = new
WebSocketDeploymentInfo();
try
{
final Xnio xnio = Xnio.getInstance("nio",
Undertow.class.getClassLoader());
final XnioWorker xnioWorker =
xnio.createWorker(OptionMap.builder().getMap());
deployment.setWorker(xnioWorker);
deployment.addEndpoint(simpleAnnotatedServerEndpoint.class);
….
final DeploymentManager deploymentManager =
defaultContainer().addDeployment(deployment()
.setClassLoader(classLoader)
.setContextPath(prefixPath)
.setDeploymentName(prefixPath)
.addServletContextAttribute(ATTRIBUTE_NAME, deployment));
deploymentManager.deploy();
.…
rootPath.addPrefixPath(prefixPath, deploymentManager.start());
deployments.put(prefixPath, deploymentManager);
_______________________________________________
undertow-dev mailing list
undertow-dev(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/undertow-dev