我有一个使用Jersey 1.18在Tomcat版本7中运行的REST Web服务。每个传入的请求都有一个自定义标头,称为“ request-id”。我想将此请求ID存储在某个地方,以便所有类都可以访问此请求ID,并将其用于日志记录。
最主要的是,这必须基于每个请求。请求A的请求ID与请求B的请求ID不同。
我在哪里可以存储这样的变量?在每个请求的基础上有效的某种上下文-有人可以指出我正确的方向吗?
最佳答案
您可以将其存储在ThreadLocal中。但是您必须小心。您需要在接收到请求时将其存储,并在返回响应时将其清除。您可能想要编写静态实用程序方法来存储和检索请求ID,如下所示:
public class RequestIdUtil {
private static final ThreadLocal<String> requestIdHolder = new ThreadLocal<String>();
private RequestIdUtil() {
// to prevent initialization
}
public static void setRequestId(String requestId) {
requestIdHolder.set(requestId);
}
/**
*
* @return requestId
*
*/
public static String getRequestId() {
return requestIdHolder.get();
}
public static void remove() {
requestIdHolder.remove();
}
}
在此示例中,即使抛出Exception,也需要在每个请求的处理结束时调用remove。