4

I need to change the thread pool of the underlying Grizzly transport layer.

According to the docs of GrizzlyHttpServerFactory:

Should you need to fine tune the underlying Grizzly transport layer, you can obtain direct access to the corresponding Grizzly structures with server.getListener("grizzly").getTransport().

and

To make certain options take effect, you need to work with an inactive HttpServer instance (that is the one that has not been started yet). To obtain such an instance, use one of the below factory methods with start parameter set to false

Since I like to put my self in the worse situations :-) the method I need shuld be:

HttpServer server= GrizzlyHttpServerFactory
       .createHttpServer(getURI(), this.config, serviceLocator, false);

but the only method available (nearest to my case) is:

public static HttpServer createHttpServer(final URI uri,
    final GrizzlyHttpContainer handler, final boolean secure,
    final SSLEngineConfigurator sslEngineConfigurator, final boolean start) {
    //....
}

If I understand the GrizzlyHttpContainer is private so I should use:

GrizzlyHttpContainer httpContainer = 
    new GrizzlyHttpContainerProvider().createContainer(GrizzlyHttpContainer.class, config);

But, since I'm sharing a ServiceLocator between resources and internal classes (a couple of ActiveMQ subscribers). I wonder if it were possible to achieve something like this:

GrizzlyHttpContainer httpContainer = 
    new GrizzlyHttpContainerProvider()
        .createContainer(GrizzlyHttpContainer.class, configuration, serviceLocator);

Ideally what i need is a method like this:

public class GrizzlyHttpContainerProvider implements ContainerProvider {
    @Override
    public <T> T createContainer(Class<T> type, Application application, Object parentContext) throws ProcessingException {
        if (HttpHandler.class == type || GrizzlyHttpContainer.class == type)  {
             return type.cast(new GrizzlyHttpContainer(application, parentContext));
        }
        return null;
    }
}

Any suggestion about how to achieve this?

I'd would prefer a cleaner solution then creating the server with one of the provided methods that (for my case) auto start the server. Then stop it (waiting for termination somehow) and then finally:

this.server.getListener("grizzly").getTransport().setWorkerThreadPool(....);

and restarting it.

Best Regards,

Luca

Edit

This is cheating :-) ... this is the "dark way" (don't do it at home):

private GrizzlyHttpContainer getGrizzlyHttpContainer(final Application  application,
                                                     final Object context) {
    try {
        Class<?> cls = Class.forName(
               "org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpContainer");
        Constructor<?> cons = cls.getDeclaredConstructor(Application.class, Object.class);
        //System.out.println("Constructor Name--->>>"+cons.getName());
        cons.setAccessible(true);
        return (GrizzlyHttpContainer)cons.newInstance(application, context);
    } catch (Exception err) {
        return null;
    }
}
Luca Sepe
  • 2,435
  • 1
  • 20
  • 26

0 Answers0