【发布时间】:2016-04-19 14:10:14
【问题描述】:
在滚动升级场景中,我想知道给定 Spring MVC 容器(由 Spring Boot 启动,在 Jetty 上运行)中何时没有活动的 HTTP 请求。
这将允许以下流程:
- 在反向代理中禁用服务器
- 等待所有请求完成
- 执行升级
有什么方法可以知道当前在 Spring MVC 或 Jetty 中处理了多少请求?
【问题讨论】:
标签: java spring spring-mvc spring-boot jetty
在滚动升级场景中,我想知道给定 Spring MVC 容器(由 Spring Boot 启动,在 Jetty 上运行)中何时没有活动的 HTTP 请求。
这将允许以下流程:
有什么方法可以知道当前在 Spring MVC 或 Jetty 中处理了多少请求?
【问题讨论】:
标签: java spring spring-mvc spring-boot jetty
您可以使用 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。
【讨论】:
您可以尝试使用弹簧靴执行器。在端点 /metrics 你应该有字段 "httpsessions.active"
【讨论】:
您可以考虑使用 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上下文中。
【讨论】: