当前位置: 移动技术网 > IT编程>开发语言>Java > Spring MVC Interceptor 实现性能监控的功能代码

Spring MVC Interceptor 实现性能监控的功能代码

2019年07月19日  | 移动技术网IT编程  | 我要评论
利用spring mvc 的 interceptor 实现个简易的性能监控,计算一下每个url的执行时间。 在 prehandle 方法中记录当前的时间戳到线程局部变量里

利用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;
 
@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/");
  }
 
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网