【问题标题】:Count number of active HTTP Requests in a Spring MVC container计算 Spring MVC 容器中的活动 HTTP 请求数
【发布时间】:2016-04-19 14:10:14
【问题描述】:

在滚动升级场景中,我想知道给定 Spring MVC 容器(由 Spring Boot 启动,在 Jetty 上运行)中何时没有活动的 HTTP 请求。

这将允许以下流程:

  1. 在反向代理中禁用服务器
  2. 等待所有请求完成
  3. 执行升级

有什么方法可以知道当前在 Spring MVC 或 Jetty 中处理了多少请求?

【问题讨论】:

    标签: java spring spring-mvc spring-boot jetty


    【解决方案1】:

    您可以使用 Jetty 的 StatisticsHandler 和 JMX 获取有关活动请求数量的信息。

    如果您使用 Jetty 作为嵌入式容器(推荐的方法),您可以使用 EmbeddedServletContainerCustomizer 进行设置:

    @Bean
    public EmbeddedServletContainerCustomizer containerCustomizer() {
        return new EmbeddedServletContainerCustomizer() {
    
            @Override
            public void customize(ConfigurableEmbeddedServletContainer container) {
                ((JettyEmbeddedServletContainerFactory) container)
                        .addServerCustomizers(new JettyServerCustomizer() {
    
                    @Override
                    public void customize(Server server) {
                        MBeanContainer mbContainer = new MBeanContainer(
                                ManagementFactory.getPlatformMBeanServer());
                        server.addEventListener(mbContainer);
                        server.addBean(mbContainer);
    
                        StatisticsHandler statisticsHandler = new StatisticsHandler();
                        statisticsHandler.setHandler(server.getHandler());
                        server.setHandler(statisticsHandler);
                    }
                });
            }
    
        };
    }
    

    您需要添加对org.eclipse.jetty:jetty-jmx 的依赖项才能访问MBeanContainer

    【讨论】:

    • 我使用的是相同的....但每次它获得 Active Request 为 0 和 Max Active 为 1 时,我的线程池限制为 64 个线程,我推送 500 个请求。你能解释一下为什么会这样吗...我的统计数据是 - pastebin.com/nyMU2aJQ
    【解决方案2】:

    您可以尝试使用弹簧靴执行器。在端点 /metrics 你应该有字段 "httpsessions.active"

    【讨论】:

      【解决方案3】:

      您可以考虑使用 AoP。这对我有用。我项目中的代码片段:

      public class CommonJoinPointConfig {
      
          @Pointcut("execution(* ru.outofrange.controller.ClaimController.searchClaims(..))")
          public void searchClaims() {
          }
      
      }
      
      
      @Aspect
      public class CounterAspect {
      
          public CounterAspect() {
          }
      
          public CounterAspect(MBeanService mBeanService) {
              this.mBeanService = mBeanService;
          }
      
          @Before("ru.outofrange.aspect.CommonJoinPointConfig.searchClaims()")
          public void beforeMethod() {
              counterService.increaseNumberOfRunningRequests();
          }
      
          @After("ru.outofrange.aspect.CommonJoinPointConfig.searchClaims()")
          public void afterMethod() {
               counterService.decreaseNumberOfRunningRequests();
          }
      
      }
      
      @Configuration
      @ComponentScan(value = {"ru.outofrange.controller", "ru.outofrange.mbean"})
      @EnableAspectJAutoProxy(proxyTargetClass=true)
      public class RestConfig extends RepositoryRestConfigurerAdapter {
      
          @Autowired
          private CounterService counterService;
      
          @Bean
          CounterAspect counterAspect(CounterService counterService){
              return new CounterAspect(counterService);
          }
      
          ...
      }
      

      一些笔记。在Config中你应该使用@EnableAspectJAutoProxy(proxyTargetClass=true)并且这个注解应该被添加到Config中,它使用控制器和服务扫描包,即定义的方面,控制器和服务应该在同一个Spring上下文中。

      【讨论】:

        猜你喜欢
        • 2020-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多