2

我正在尝试将 Spring Web 应用程序(已完成基于注释的配置,xml 配置)与指标 3.0 结合起来。

我在码头内运行应用程序。

这是我当前对默认 DispatcherServlet 的配置:

public class WebInitializer extends
        AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return null;
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[] { WebConfig.class };
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }

    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding("UTF-8");
        return new Filter[] { characterEncodingFilter };
    }

}

这是 Web 配置:

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.rebuy.silo.amqpredelivery")
@EnableJpaRepositories(basePackages = "com.rebuy.silo.amqpredelivery.domain")
@EnableAspectJAutoProxy
@EnableTransactionManagement
public class WebConfig extends WebMvcConfigurerAdapter {

    @Bean
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }

    @Override
    public void configureMessageConverters(
            List<HttpMessageConverter<?>> converters) {
        MappingJackson2HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter();
        jacksonConverter.setObjectMapper(objectMapper());
        converters.add(jacksonConverter);
        super.configureMessageConverters(converters);
    }

    @Bean
    public ObjectMapper objectMapper() {
        SimpleDateFormat format = new SimpleDateFormat(
                "yyyy-MM-dd'T'HH:mm:ssXXX");
        format.setTimeZone(TimeZone.getTimeZone("GMT+1"));
        ObjectMapper mapper = new ObjectMapper();
        mapper.setDateFormat(format);
        return mapper;
    }
}

我想添加这两个 Servlet:

做这个的最好方式是什么?我认为应该有一些春天的魔法让这非常容易做到!但我找不到它:(

提前感谢比约恩

4

3 回答 3

4

您可以关注此代码库https://github.com/spiritedtechie/metrics-examples

或者使用这个名为 metrics-spring http://ryantenney.github.io/metrics-spring/的库

于 2013-10-29T09:32:27.100 回答
2

如果您使用 Spring 和 Metrics,您还应该使用 @RyanTenney 的 Metrics-Spring 模块。它将简化您的 Java 配置并使您的 Metrics 使用更加清晰。

查看 MetricsServlet 和 HealthCheckServlet 背后的代码。在我看来,编写自己的 Spring Controller 来做同样的事情比弄清楚如何嵌入和包装那些旧的 servlet 更容易。

这简单!

创建一个指标特定的配置:

@Configuration
@EnableMetrics
public class MetricsConfig extends MetricsConfigurerAdapter {
    @Override
    public void configureReporters(MetricRegistry metricRegistry) {
        registerReporter(ConsoleReporter
            .forRegistry(metricRegistry)
            .build()).start(5, TimeUnit.MINUTES);
    }
}

并通过添加从现有配置中包含它:

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.rebuy.silo.amqpredelivery")
@EnableJpaRepositories(basePackages = "com.rebuy.silo.amqpredelivery.domain")
@EnableAspectJAutoProxy
@EnableTransactionManagement
@Import({MetricsConfig.class})
public class WebConfig extends WebMvcConfigurerAdapter {
...

上述配置更改使得在任何 Spring 组件中注入 MetricRegistry 变得微不足道。MetricsServlet 所做的只是发送注册表以响应请求。这在一个简单的控制器中很容易实现。例如:

@Controller
public class AdminMetricsController
{
    @Autowired
    MetricRegistry metricRegistry;

    @RequestMapping(value = "/admin/metrics/", produces = {APPLICATION_JSON_VALUE})
    public @ResponseBody MetricRegistry getMetrics(final HttpServletResponse response)
    {
        response.setHeader("Cache-Control", "must-revalidate,no-cache,no-store");
        return metricRegistry;
    }

}

可以以类似的方式注入 HealthCheckRegistry 并添加另一种方法,该方法将响应 /admin/health/ 或您想要的任何 url。

于 2015-07-10T00:47:24.653 回答
0

看看下面的答案。它解释了如何通过 JavaConfig 注册 Servlet:

Spring JavaConfig:为自定义 Servlet 添加映射

于 2014-01-21T05:55:38.023 回答