我需要更改底层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;
}
}