Spring MVC Interceptor 實(shí)現(xiàn)性能監(jiān)控的功能代碼
利用Spring MVC 的 Interceptor 實(shí)現(xiàn)個(gè)簡(jiǎn)易的性能監(jiān)控,計(jì)算一下每個(gè)url的執(zhí)行時(shí)間。
在 preHandle 方法中記錄當(dāng)前的時(shí)間戳到線程局部變量里,然后在afterCompletion方法中,用當(dāng)前的時(shí)間戳剪掉線程局部變量里的時(shí)間戳得出個(gè)運(yùn)行時(shí)間,并記錄到log里。
這只是個(gè)簡(jiǎn)易的性能監(jiān)控,如果想長(zhǎng)期正式的監(jiān)控性能,請(qǐng)選擇其它成熟的產(chǎn)品。
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:{} 執(zhí)行了 {} 毫秒", request.getRequestURI(), executeTime); } }
這里的是NamedThreadLocal沒(méi)啥神器的,源碼如下:
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,注冊(cè)即可。
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; @Configuration public 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/"); } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Spring MVC 關(guān)于controller的字符編碼問(wèn)題
在使用springMVC框架構(gòu)建web應(yīng)用,客戶端常會(huì)請(qǐng)求字符串、整型、json等格式的數(shù)據(jù),通常使用@ResponseBody注解使 controller回應(yīng)相應(yīng)的數(shù)據(jù)而不是去渲染某個(gè)頁(yè)面。2017-03-03SpringBoot3集成ElasticSearch的方法詳解
Elasticsearch是一個(gè)分布式、RESTful風(fēng)格的搜索和數(shù)據(jù)分析引擎,適用于各種數(shù)據(jù)類型,數(shù)字、文本、地理位置、結(jié)構(gòu)化數(shù)據(jù)、非結(jié)構(gòu)化數(shù)據(jù),本文給大家詳解介紹了SpringBoot3集成ElasticSearch的方法,需要的朋友可以參考下2023-08-08寫了兩年代碼之后再來(lái)談一談Spring中的Bean
這篇文章主要介紹了寫了兩年代碼之后再來(lái)看看Spring中的Bean,這里列出四種常用的添加Bean的方式,介紹最基本的@Bean注解,@Bean注解聲明這個(gè)類是一個(gè)Bean,需要的朋友可以參考下2021-10-10java算法題解LeetCode35復(fù)雜鏈表的復(fù)制實(shí)例
這篇文章主要為大家介紹了java算法題解LeetCode35復(fù)雜鏈表的復(fù)制實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01SpringData JPA Mongodb查詢部分字段問(wèn)題
這篇文章主要介紹了SpringData JPA Mongodb查詢部分字段問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08java微信開(kāi)發(fā)API第一步 服務(wù)器接入
這篇文章主要為大家分享了java微信開(kāi)發(fā)API的第一步操作服務(wù)器接入,感興趣的小伙伴們可以參考一下2016-05-05