users@grizzly.java.net

Re: Using SPDY with Grizzly

From: Ryan Lubke <ryan.lubke_at_oracle.com>
Date: Wed, 15 Jun 2016 09:38:37 -0700

Hi Steve,

You're next on my list. Will follow up asap.

> Steve Curtis <mailto:stevo.curtis_at_googlemail.com>
> June 15, 2016 at 09:12
> 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
>
>
> Steve Curtis <mailto:stevo.curtis_at_googlemail.com>
> June 13, 2016 at 02:36
> 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
>
>
> Ryan Lubke <mailto:ryan.lubke_at_oracle.com>
> June 12, 2016 at 18:59
> 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 <mailto: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/").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
>