Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Spring boot Tomcat场景中清除线程上下文?_Java_Spring Boot_Spring Boot Actuator - Fatal编程技术网

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();
}
}