时间:2021-05-20
利用Spring MVC 的 Interceptor 实现个简易的性能监控,计算一下每个url的执行时间。
在 preHandle 方法中记录当前的时间戳到线程局部变量里,然后在afterCompletion方法中,用当前的时间戳剪掉线程局部变量里的时间戳得出个运行时间,并记录到log里。
这只是个简易的性能监控,如果想长期正式的监控性能,请选择其它成熟的产品。
Interceptor
import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse; import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.core.NamedThreadLocal;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView; public class PerformanceInterceptor implements HandlerInterceptor { private final static Logger LOGGER = LoggerFactory.getLogger(PerformanceInterceptor.class); private NamedThreadLocal<Long> startTimeThreadLocal = new NamedThreadLocal<Long>("performance"); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { startTimeThreadLocal.set(System.currentTimeMillis()); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { return; } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { long currentTime = System.currentTimeMillis(); long executeTime = currentTime - startTimeThreadLocal.get(); LOGGER.info("uri:{} 执行了 {} 毫秒", request.getRequestURI(), executeTime); } }这里的是NamedThreadLocal没啥神器的,源码如下:
package org.springframework.core; import org.springframework.util.Assert; public class NamedThreadLocal<T> extends ThreadLocal<T> { private final String name; public NamedThreadLocal(String name) { Assert.hasText(name, "Name must not be empty"); this.name = name; } @Override public String toString() { return this.name; } }定义完Interceptor,注册即可。
import java.util.List; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;import org.springframework.boot.web.filter.OrderedCharacterEncodingFilter;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.http.converter.HttpMessageConverter;import org.springframework.web.filter.CharacterEncodingFilter;import org.springframework.web.servlet.config.annotation.InterceptorRegistry;import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import com.vnierlai.scm.webapp.interceptor.PerformanceInterceptor; @Configurationpublic class WebMvcConfigurer extends WebMvcConfigurerAdapter { @Bean @ConditionalOnMissingBean(CharacterEncodingFilter.class) public CharacterEncodingFilter characterEncodingFilter() { CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter(); filter.setEncoding("UTF-8"); return filter; } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new PerformanceInterceptor()).addPathPatterns("/**"); super.addInterceptors(registry); } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); // registry.addResourceHandler("/resources/**").addResourceLocations("/resources/"); } }以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文以实例形式实现了python监控linux性能以及进程消耗性能的方法,具体实现代码如下:#-*-coding:utf-8-*-"""CreatedonTue
整理文档,搜刮出一个Spring实现excel及pdf导出表格的代码,稍微整理精简一下做下分享。excel导出:packagelight.mvc.utils.e
Spring框架七大模块简单介绍Spring中MVC模块代码详解ORM模块对Hibernate、JDO、TopLinkiBatis等ORM框架提供支持ORM模块
SpringMVC属于SpringFrameWork的后续产品,已经融合在SpringWebFlow里面。Spring框架提供了构建Web应用程序的全功能MVC
在生产环境中,需要实时或定期监控服务的可用性。spring-boot的actuator(监控)功能提供了很多监控所需的接口。简单的配置和使用如下:1、引入依赖: