All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.gitee.easyopen.monitor.MonitorInterceptor Maven / Gradle / Ivy

package com.gitee.easyopen.monitor;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.gitee.easyopen.ApiConfig;
import com.gitee.easyopen.ApiContext;
import com.gitee.easyopen.ApiParam;
import com.gitee.easyopen.HasConfig;
import com.gitee.easyopen.exception.BusinessParamException;
import com.gitee.easyopen.interceptor.ApiInterceptorAdapter;

/**
 * 负责监控的拦截器
 * 
 * @author tanghc
 */
public class MonitorInterceptor extends ApiInterceptorAdapter implements Visitor, HasConfig {

    private static final String START_TIME = MonitorInterceptor.class.getSimpleName() + "_START_TIME";

    private ApiConfig apiConfig;
    
    private ExecutorService executorService = null;

    public MonitorInterceptor(ApiConfig apiConfig) {
        super();
        this.apiConfig = apiConfig;
        executorService = Executors.newFixedThreadPool(apiConfig.getMonitorExecutorSize());
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object serviceObj, Object argu)
            throws Exception {
        this.in(request, serviceObj, argu);
        return true;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object serviceObj,
            Object argu, Object result, Exception e) throws Exception {
        this.out(request, serviceObj, argu, result, e);
    }

    @Override
    public void in(HttpServletRequest request, Object serviceObj, Object argu) {
        request.setAttribute(START_TIME, System.currentTimeMillis());
    }

    @Override
    public void out(final HttpServletRequest request, Object serviceObj, final Object argu, final Object result, final Exception e) {
        if(e instanceof BusinessParamException) {
            return;
        }
        final long endTime = System.currentTimeMillis();
        final Long startTime = (Long) request.getAttribute(START_TIME);
        final MonitorStore store = this.getMonitorStore();
        final ApiParam param = ApiContext.getApiParam();
        executorService.execute(new Runnable() {
            @Override
            public void run() {
                store.stat(param, startTime, endTime, argu, result, e);
            }
        });
    }

    public MonitorStore getMonitorStore() {
        return this.apiConfig.getMonitorStore();
    }

    @Override
    public ApiConfig getApiConfig() {
        return apiConfig;
    }

    @Override
    public void setApiConfig(ApiConfig apiConfig) {
        this.apiConfig = apiConfig;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy