【问题标题】:Dropwizard - override the url for the healthcheck endpointDropwizard - 覆盖健康检查端点的 url
【发布时间】:2014-10-23 12:58:19
【问题描述】:

Dropwizard 使用 Codahale Metrics HealthCheck servlet。在 dropwizard 之外使用 servlet 时,您可以通过设置 init-param "healthcheck-uri" 来覆盖 URI。

有没有办法在 dropwizard 中覆盖它?

看起来这与在 NonblockingServletHolder 上设置初始化参数有关。

【问题讨论】:

  • 您还有问题吗?

标签: servlets jetty dropwizard


【解决方案1】:

你说得对,正在构建一个 NonblockingServletHolder。问题是 Dropwizard DefaultServerFactory 没有传输 applicationContext 或 adminContext 中设置的任何参数,它们都是 dropwizard 环境的一部分。

我相信您唯一可行的选择是扩展 AbstractServerFactory 并在初始化之前在 AdminServlet 的配置中设置初始化参数。 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 参数隐藏在 _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")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-29
    • 2015-10-27
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    相关资源
    最近更新 更多