package com.iplatform.base.support; import com.iplatform.base.AsyncManager; import com.iplatform.base.service.ApiTimeServiceImpl; import com.iplatform.model.vo.ApiTime; import com.walker.infrastructure.utils.DateUtils; import com.walker.infrastructure.utils.NumberGenerator; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; import java.util.TimerTask; /** * 统计接口调用时间拦截器实现。 *
* 1) 拦截所有接口 * 2) 如果接口调用时间小于阈值,则只计算累加调用量; * 3) 如果接口调用时间大于阈值,则会记录详细内容:接口位置、时间、耗时等 * 4) 写入数据库结果并非实时,而是会实时写入缓存,等到触发机制时才会刷盘。触发机制如下: * * 4.1) 计数到达 * 4.2) 访问结果接口,查询统计结果时 * * 5) 统计结果接口地址:/test/time/statistics ** @author 时克英 * @date 2024-02-29 */ public class TimeStatisticsInterceptor implements HandlerInterceptor { public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // String uri = request.getRequestURI(); if(this.enabled){ long startTime = System.nanoTime(); request.setAttribute("startTime", startTime); } return true; // if (url.indexOf("/list") >= 0) { // this.logger.debug("拦截器执行:preparePageSearch()"); // this.preparePageSearch(request); // } // return this.doPreHandleOther(url, request, response); } public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object args, Exception exception) throws Exception { if(this.enabled){ Object startTimeObj = request.getAttribute("startTime"); if(startTimeObj != null){ long startTime = Long.parseLong(startTimeObj.toString()); long costTime = (System.nanoTime() - startTime); // 小于1毫秒的显示为0 if(costTime < 1000000){ costTime = 0; } else { costTime = costTime / 1000000; } ApiTime apiTime = new ApiTime(); apiTime.setId(NumberGenerator.getLongSequenceNumber()); apiTime.setCreateTime(DateUtils.getDateTimeNumber()); long currentDate = DateUtils.getDateNumber(System.currentTimeMillis()); apiTime.setRequestDate((int)currentDate); apiTime.setUri(request.getRequestURI()); apiTime.setCostTime(costTime); AsyncManager.me().execute(this.acquireOperateLogTask(apiTime)); } } } private TimerTask acquireOperateLogTask(ApiTime apiTime){ return new TimerTask() { @Override public void run() { apiTimeService.execInsertApiTime(apiTime); } }; } public void setApiTimeService(ApiTimeServiceImpl apiTimeService) { this.apiTimeService = apiTimeService; } /** * 是否启用接口时间拦截。 * @param enabled */ public void setEnabled(boolean enabled) { this.enabled = enabled; } private boolean enabled = false; private ApiTimeServiceImpl apiTimeService; }