Dropwizard使用Codahale Metrics HealthCheck servlet。当使用dropwizard之外的servlet时,您可以通过设置init-param“healthcheck-uri”来覆盖URI。
有没有办法在dropwizard中覆盖它?
看起来它与在NonblockingServletHolder上设置init-param有关。
答案 0 :(得分:0)
您正在构建NonblockingServletHolder。问题是Dropwizard DefaultServerFactory没有传输applicationContext或adminContext中设置的任何params,它们都是dropwizard环境的一部分。
我相信你唯一可行的选择是在初始化之前扩展AbstractServerFactory并在AdminServlet的配置中设置init params。 DefaultServerFactory可以由Configuration子类扩展和设置。
class MyServerFactory extends DefaultServerFactory{
//Copied from AbstractServerFactory
protected Handler createAdminServlet(Server server,
MutableServletContextHandler handler,
MetricRegistry metrics,
HealthCheckRegistry healthChecks) {
//Copied from AbstractServerFactory.configureSessionsAndSecurity because its private and can't be called here
if (handler.isSecurityEnabled()) {
handler.getSecurityHandler().setServer(server);
}
if (handler.isSessionsEnabled()) {
handler.getSessionHandler().setServer(server);
}
handler.setServer(server);
handler.getServletContext().setAttribute(MetricsServlet.METRICS_REGISTRY, metrics);
handler.getServletContext().setAttribute(HealthCheckServlet.HEALTH_CHECK_REGISTRY, healthChecks);
//HERE - set the init parameter and add the servlet
def holder = new NonblockingServletHolder(new AdminServlet())
holder.setInitParameter("healthcheck-uri", "/myurl")
handler.addServlet(holder, "/*");
//END
handler.addFilter(AllowedMethodsFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST))
.setInitParameter(AllowedMethodsFilter.ALLOWED_METHODS_PARAM, Joiner.on(',').join(allowedMethods));
return handler;
}
}
配置子类:
class MyConfiguration extends Configuration{
MyConfiguration(){
setServerFactory(new MyServerFactory())
}
}
其价值:
我深入研究了初始化servlet的代码,并在一段时间后意识到,如果不覆盖ServerFactory正在做的事情,我就无法做任何事情: dropwizard Environment有一个adminContext,applicationContext和ServletEnvironment,所有这些都允许你设置初始化参数。 AdminServlet类是使用“healthcheck-uri”的init参数的地方,所以我希望在adminContext中设置这些参数会将它们传递给AdminServlet,但是唉,它们不是因为最终Jetty ServletContextHandler设置AdminServlet的init params埋在_servletHandler._servletContext._initParams中。
这些都不会为您做任何事:
environment.adminContext.setInitParameter("healthcheck-uri","/something")
environment.applicationContext.setInitParameter("healthcheck-uri","/something")
environment.servlets().setInitParameter("healthcheck-uri","/something")
environment.admin().setInitParameter("healthcheck-uri","/something")