我有一个使用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。

07-24 18:25
查看更多