gpt4 book ai didi

java - 何时从 MDC 中删除

转载 作者:搜寻专家 更新时间:2023-11-01 02:26:39 25 4
gpt4 key购买 nike

我最近发现了使用 MDCs 的魔力登录时。效果很好。

我有以下方法:

public static final String MDC_CLIENT="client";
public static final String MDC_SESSION="session";
public static final String MDC_DEVICE="device";

// Called for every request.
public static void request(final HttpServletRequest request) {
// The MDC is a thread-local storage accessable from the log formatter.
MDC.put(MDC_CLIENT, String.format("%s:%s", request.getRemoteHost(), request.getRemotePort()));
HttpSession session = request.getSession();
MDC.put(MDC_SESSION, session.getId());
MDC.put(MDC_DEVICE, (String)session.getAttribute("device"));
// Also record the context.
setContext(session.getServletContext());
}

这被称为每个 jsp 中的第一个 Action 。这使我可以很好地跟踪日志中的 session 详细信息。

但是 - 我如何知道何时删除这些映射条目?我应该关注什么事件才能让我整理 map ?

我在 Tomcat 下托管。如果它重新使用线程,那么我就不会泄漏内存,因为它们本质上是线程本地的,所以每个 put 都会覆盖上次使用线程时的旧 put .如果它不存在——或者我被托管在其他不存在的东西下——我基本上可能会永远增长 map ——或者至少直到主机重新启动。

我认为我的问题的本质是 - 是否有一个事件我可以检测到表明特定 session 或线程已完成并即将被释放。

最佳答案

我不会在每个 JSP 中调用,而是注册一个 ServletRequestListener。 ,在请求开始和完成时都会收到通知:

public class MDCListener implements ServletRequestListener {
public void requestInitialized(ServletRequestEvent e) {
YourUtilityClass.request((HttpServletRequest)e.getServletRequest());
}

public void requestDestroyed(ServletRequestEvent e) {
YourUtilityClass.tearDown((HttpServletRequest)e.getServletRequest());
}
}

或者,您可以使用过滤器,让您绕过通常的请求处理流程:

void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
setupMDC();
chain.doFilter(request, response);
tearDownMDC();
}

无论哪种方式,您只需在 web.xml 中注册相关类,其余的由容器处理。

关于java - 何时从 MDC 中删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21137307/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com