users@grizzly.java.net

WebSocket clinet with Grizzly

From: Weiqi Gao <weiqigao_at_gmail.com>
Date: Thu, 02 May 2013 16:30:53 -0500

Hi,

I'm not sure if this is the right mailing list for the question. I
subscribed for a few weeks ago but didn't see too much traffic. But I
saw Ryan Lubke's post yesterday. So I thought I'll ask the question here
and if there is a better place where Grizzly related discussions are
happening, please point me to that location.

I'm trying to write a WebSocket client that establishes permanent secure
(wss://) connections to a WebSocket server using the Grizzly framework.

I have several meta-questions and a real question:

Meta-Q1: The WebSockets chapter of the Grizzly documentation points me
to Ryan's blog entry "Async HTTP Client 1.7.0 Released. Details on the
Grizzly Side of Things…"
(http://www.notshabby.net/2012/01/async-http-client-1-7-0-released-details-on-the-grizzly-side-of-things/).
It was written in January 2012. Is it still current?

Meta-Q2: The blog entry points to the Maven dependency:

<dependency>
<groupId>org.glassfish.grizzly</groupId>
<artifactId>grizzly-http-client</artifactId>
<version>1.0</version>
</dependency>

I saw that version 1.3 of the same package is available at Maven
Central. I assume it is OK to use 1.3. Am I right?

Meta-Q3: Why is grizzly-http-client not versioned like the rest of the
Grizzly components? Is it somehow less of an integral part of the
Grizzly framework?

Meta-Q4: The grizzly-http-client-1.3-sources.jar that I got from Maven
Central contains only one Java source file, that of
org/glassfish/grizzly/http/clientVersion.java. Where can I get the rest
of the sources from Maven Central?

Q1: I create the WebSocket using the following code:

AsyncHttpClientConfig asyncHttpClientConfig =
new AsyncHttpClientConfig.Builder()
.setSSLContext(MySSLUtil.createSSLContext())
.build();
AsyncHttpClient asyncHttpClient =
new AsyncHttpClient(new GrizzlyAsyncHttpProvider(asyncHttpClientConfig),
asyncHttpClientConfig);
WebSocketListener webSocketListener = new DefaultWebSocketListener() {
// my processing
};
WebSocketUpgradeHandler handler =
new WebSocketUpgradeHandler.Builder()
.addWebSocketListener(webSocketListener)
.build();
String wsUrl = "wss://localhost/context";
WebSocket webSocket =
asyncHttpClient.prepareGet(wsUrl).execute(handler).get();

It successfully connects to the server and establishes the connection,
over which the client was able to exchange data with the server.
However, after a minute or so, the IdleTimeoutFilter that was
instantiated here

<init>():129, IdleTimeoutFilter {org.glassfish.grizzly.utils}
initializeTransport():346, GrizzlyAsyncHttpProvider
{com.ning.http.client.providers.grizzly}
<init>():176, GrizzlyAsyncHttpProvider
{com.ning.http.client.providers.grizzly}

would fire and eventually close the WebSocket connection:

java.util.concurrent.TimeoutException: Timeout exceeded
at
com.ning.http.client.providers.grizzly.GrizzlyAsyncHttpProvider.timeout(GrizzlyAsyncHttpProvider.java:518)
at
com.ning.http.client.providers.grizzly.GrizzlyAsyncHttpProvider$3.onTimeout(GrizzlyAsyncHttpProvider.java:350)
at
org.glassfish.grizzly.utils.IdleTimeoutFilter$DefaultWorker.doWork(IdleTimeoutFilter.java:385)
at
org.glassfish.grizzly.utils.IdleTimeoutFilter$DefaultWorker.doWork(IdleTimeoutFilter.java:365)
at
org.glassfish.grizzly.utils.DelayedExecutor$DelayedRunnable.run(DelayedExecutor.java:153)
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:722)

What is the best way to get around my problem?

TIA,
--
Weiqi Gao
weiqigao_at_gmail.com
http://weiqigao.blogspot.com/