计算Spring MVC容器中活动HTTP请求的数量

时间:2016-04-19 14:10:14

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

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

这将允许以下流程:

  1. 在反向代理中禁用服务器
  2. 等待所有请求完成
  3. 执行升级
  4. 有没有办法告诉我们当前在Spring MVC或Jetty中处理了多少请求?

3 个答案:

答案 0 :(得分:2)

您可以使用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

答案 1 :(得分:0)

您可以尝试使用弹簧套筒执行器。在端点/指标上,您应该有字段 “httpsessions.active”

答案 2 :(得分:0)

您可以考虑使用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上下文中。