Java 如何在Spring boot Tomcat场景中清除线程上下文?
我们实现了一个Java 如何在Spring boot Tomcat场景中清除线程上下文?,java,spring-boot,spring-boot-actuator,Java,Spring Boot,Spring Boot Actuator,我们实现了一个HandlerInterceptor来在preHandle方法中设置MDC线程上下文数据 然后,我们将这些数据用于日志记录和度量目的 但是如果我们在afterCompletion方法中使用MDC.clear()清除MDC数据,那么在此之后的度量处理程序将丢失有价值的信息。我特别提到的是WebMvcTagsProvider,但我认为这适用于所有类型的用例 因为有一个线程池,一个线程最终将被重用,并包含来自上一个HTTP请求的MDC上下文,这是非常糟糕的 那么,如何“包装”setup和
HandlerInterceptor
来在preHandle
方法中设置MDC线程上下文数据
然后,我们将这些数据用于日志记录和度量目的
但是如果我们在afterCompletion
方法中使用MDC.clear()
清除MDC数据,那么在此之后的度量处理程序将丢失有价值的信息。我特别提到的是WebMvcTagsProvider
,但我认为这适用于所有类型的用例
因为有一个线程池,一个线程最终将被重用,并包含来自上一个HTTP请求的MDC上下文,这是非常糟糕的
那么,如何“包装”setup和finalize方法中线程的用法呢?
理想情况下,这将是一个通用的解决方案。我不想更改现有代码。目标是,新的传入请求不能访问以前的MDC上下文
我已经知道如何在Java EE世界解决这个问题,例如:
@Provider
@优先级(Priorities.USER+1)
公共类MdcClearFilter实现ContainerResponseFilter{
@凌驾
公共空隙过滤器(
ContainerRequestContext请求上下文,
ContainerResponseContext(ContainerResponseContext){
MDC.clear();
}
}
那么,在Spring Boot世界中,我该如何做同样的事情呢?因为
HandlerInterceptor
s都在Servlet上下文中,所以它们无法突破
因此,解决方案是使用一个servlet过滤器,其顺序有序。优先级最高
@组件
@顺序(有序。最高优先级)
公共类MDCClearFilter实现过滤器{
@凌驾
公共无效doFilter(ServletRequest请求,
ServletResponse,
过滤链(链条)
抛出IOException、ServletException{
链式过滤器(请求、响应);
MDC.clear();
}
}