Jersey + Grizzly Http Container +共享ServiceLocator +自定义工作线程池

时间:2017-11-30 14:04:02

标签: java jersey grizzly

我需要更改底层Grizzly传输层的线程池。

根据GrizzlyHttpServerFactory的{​​{3}}:

  

如果您需要微调基础Grizzly传输层,您可以使用server.getListener("grizzly").getTransport()直接访问相应的Grizzly结构。

  

要使某些选项生效,您需要使用非活动的HttpServer实例(即尚未启动的实例)。要获取此类实例,请使用以下工厂方法之一,并将start参数设置为false

因为我喜欢把自己置于更糟糕的境地:-)我需要的方法是:

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

但唯一可用的方法(最接近我的情况)是:

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

如果我理解GrizzlyHttpContainer是私有的,那么我应该使用:

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

但是,因为我在资源和内部类(一些ActiveMQ订阅者)之间共享ServiceLocator。我想知道是否有可能实现这样的目标:

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

理想情况下我需要的是这样的方法:

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;
    }
}

有关如何实现这一目标的任何建议?

我更喜欢更清洁的解决方案,然后使用提供的方法之一创建服务器(对于我的情况)自动启动服务器。然后停止它(等待某种方式终止)然后最后:

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

然后重新启动它。

最诚挚的问候,

卢卡

修改

这是作弊:-) ...这是&#34;黑暗的方式&#34; (不要在家里做):

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;
    }
}

0 个答案:

没有答案