Dee*_*mar 5 spring spring-mvc spring-webflux
我Spring WebFlux在我的项目中使用。我想创建一个拦截器来计算每个API花费的时间。在Spring MVC我们所HandlerInterceptor没有的spring-boot-starter-webflux。我尝试添加spring-boot-starter-web并编写了拦截器,但没有成功。这是代码:
@Component
public class TimeInterceptor implements HandlerInterceptor {
public static Logger logger = Logger.getLogger(TimeInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
long startTime = System.currentTimeMillis();
request.setAttribute("startTime", startTime);
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
long totaltime = System.currentTimeMillis() - (long) request.getAttribute("startTime");
request.setAttribute("totaltime", totaltime);
logger.info("Logging total time" + totaltime);
}
...
...
Run Code Online (Sandbox Code Playgroud)
我想向我的应用程序添加类似的功能,并拦截每次调用所花费的时间。
提前致谢。
HandlerInterceptorSpring WebFlux 中没有 的概念,但您可以使用自己的概念WebFilter。
您描述的功能听起来很像 Actuator 和 Micrometer 提供的指标支持。如果您想尝试一下:
Micrometer 提供了更多功能,可帮助您获得正确的指标,例如:在测量时间时考虑 GC 暂停、提供直方图/百分位数/...等等。
注意:添加spring-boot-starter-web到您的应用程序会将其变成 Spring MVC 应用程序。
如果要在请求开始和完成时处理请求,可以使用WebFilter。
尝试这样的事情
@Component
public class CustomWebFilter implements WebFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
long startTime = System.currentTimeMillis();
return chain.filter(exchange).doFinally(signalType -> {
long totalTime = System.currentTimeMillis() - startTime;
exchange.getAttributes().put("totalTime", totalTime);
System.out.println(totalTime);
});
}
}
Run Code Online (Sandbox Code Playgroud)
当请求处理开始时,所有定义的过滤器都会被调用。Mono 从过滤器返回。它指示请求处理何时完成。
| 归档时间: |
|
| 查看次数: |
2817 次 |
| 最近记录: |