users@grizzly.java.net

Re: Using SPDY with Grizzly

From: Steve Curtis <stevo.curtis_at_googlemail.com>
Date: Wed, 15 Jun 2016 17:12:32 +0100

Just a quick update to say I updated the github code to remove the
HttpHandler and build responses via the Jersey annotated resource class,
the code should be simpler to follow.

Everything starts but I don't see SPDY protocol enabled (I'm using the
Chrome "HTTP/2 and SPDY indicator" plugin to test this).

Is there anything extra I need to do from the client or server sides?
Maybe setting HTTP headers or something else to initiate the protocol?

Any help would be greatly appreciated.

Steve

On 13 June 2016 at 10:36, Steve Curtis <stevo.curtis_at_googlemail.com> wrote:

> Hi Ryan,
>
> I was running it with Open JDK 1.7.0_101
>
> Since it's a Windows machine I'm developing on I used the Azul provided
> OpenJDK build at http://www.azul.com/downloads/zulu/zulu-windows/
>
> Cheers
>
> On 13 June 2016 at 02:59, Ryan Lubke <ryan.lubke_at_oracle.com> wrote:
>
>> Hi Steve,
>>
>> Do you recall the exact version of the Open JDK you tested with? The NPN
>> code is pretty sensitive to the version of the runtime. NOTE: It won't
>> work at all with the Oracle JDK.
>>
>> Steve Curtis <stevo.curtis_at_googlemail.com>
>> June 12, 2016 at 16:22
>>
>> I’ve inherited a client-server application that creates a significant
>> amount of asynchronous ajax calls from the front end. We were using Simple
>> Framework for our backend and I have now swapped in Grizzly with the
>> intention of making use of SPDY protocol to avoid the max 6 browser
>> connections we are seeing at the moment.
>>
>>
>>
>> I have the application standing up fine, but it still seems to use
>> standard HTTP 1.1 over SSL and not SPDY.
>>
>>
>>
>> The code I’ve written is:
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>> *public void runServer(int port) throws IOException{
>> logger.info("starting grizzly framework server on port {}", port);
>> ResourceConfig resourceConfig = new ResourceConfig(JerseyResource.class);
>> uri = UriBuilder.fromUri("https://localhost/
>> <https://localhost/>").port(port).build(); server =
>> GrizzlyHttpServerFactory.createHttpServer(uri, resourceConfig, true,
>> createSSLContextConfigurator()); listener =
>> server.getListeners().iterator().next(); listener.setSecure(true);
>> NIOTransport nioTransport = TCPNIOTransportBuilder.newInstance()
>> .setReuseAddress(true) .setIOStrategy(WorkerThreadIOStrategy.getInstance())
>> .setSelectorThreadPoolConfig(ThreadPoolConfig.defaultConfig().setCorePoolSize(2).setMaxPoolSize(4))
>> .setWorkerThreadPoolConfig(ThreadPoolConfig.defaultConfig().setCorePoolSize(3).setMaxPoolSize(20))
>> .build(); listener.setTransport((TCPNIOTransport)nioTransport); SpdyAddOn
>> spdyAddOn = new SpdyAddOn(SpdyMode.NPN); listener.registerAddOn(spdyAddOn);
>> final ServerConfiguration serverConfiguration =
>> server.getServerConfiguration(); serverConfiguration.addHttpHandler(new
>> HttpHandler() { public void service(Request request, Response response)
>> throws Exception { long startTime = new Date().getTime(); // Put a short
>> sleep in here so can see if requests queue up from browser
>> Thread.currentThread().sleep(500); // Get SPDY stream if it exists final
>> SpdyStream spdyStream = (SpdyStream)
>> request.getAttribute(SpdyStream.SPDY_STREAM_ATTRIBUTE); // if spdy stream
>> is null it is not a SPDY based request if (spdyStream != null) {
>> logger.info("found a SPDY stream"); } else { logger.info("no SPDY stream
>> available"); } final SimpleDateFormat format = new SimpleDateFormat("EEE,
>> dd MMM yyyy HH:mm:ss zzz", Locale.UK); final String date =
>> format.format(new Date(System.currentTimeMillis()));
>> response.setContentType("text/plain");
>> response.setContentLength(date.length()); response.getWriter().write(date);
>> logger.info("processed request in {} ms", new Date().getTime() -
>> startTime); } } ); server.start(); logger.info("bootstrap of grizzly
>> framework server complete, running on {}", uri);}protected
>> SSLEngineConfigurator createSSLContextConfigurator() throws
>> MalformedURLException{ SSLContextConfigurator sslContextConfigurator = new
>> SSLContextConfigurator(); ClassLoader classLoader =
>> getClass().getClassLoader();
>> sslContextConfigurator.setKeyStoreFile(classLoader.getResource("keystore.jks").getFile().toString());
>> sslContextConfigurator.setKeyStorePass("changeit");
>> sslContextConfigurator.validateConfiguration(true); SSLEngineConfigurator
>> result = new SSLEngineConfigurator(
>> sslContextConfigurator.createSSLContext(), false, false, false);
>> result.setClientMode(false); return result;*
>>
>> *}*
>>
>>
>>
>> The code is hosted on GitHub at
>> https://github.com/stevocurtis/public-development/blob/master/subprojects/playpens/java-playpen/web/grizzly-framework-playpen/src/main/java/com/fenixinfotech/grizzly/framework/playpen/JerseyGrizzlyFrameworkServer.java
>>
>>
>>
>> Notes:
>>
>>
>>
>> 1. I’ve run this against both open jdk 7 and oracle jdk 7.
>>
>> 2. I’ve tried bootstrapping with both the
>> grizzly-npn-bootstrap-1.0.jar and grizzly-npn-bootstrap-1.2.jar files.
>>
>> 3. You can see the dependencies in the pom but they are:
>>
>>
>>
>> jersey-container-grizzly2-http 2.35
>>
>> grizzly-http2 2.3.25
>>
>> grizzly-http-server 2.3.25
>>
>> grizzly-spdy 2.3.25
>>
>> grizzly-npn-bootstrap 1.2
>>
>>
>>
>> I’m wondering is there anything else I need to do to “trigger” initiation
>> of a SPDY protocol? Setting headers maybe.
>>
>>
>>
>> Thanks in advance,
>>
>>
>>
>> Steve
>>
>>
>>
>