优化:基于阿里巴巴 Java 开发手册(黄山版)优化 ThreadLocal 使用

1.编程规约>并发处理>第6条:
【强制】必须回收自定义的 ThreadLocal 变量记录的当前线程的值,尤其在线程池场景下,线程经常会
被复用,如果不清理自定义的 ThreadLocal 变量,可能会影响后续业务逻辑和造成内存泄露等问题。
尽量在代码中使用 try-finally 块进行回收。
This commit is contained in:
Charles7c 2023-03-04 14:01:33 +08:00
parent 4779d77265
commit c4d9bd3a75

View File

@ -120,26 +120,30 @@ public class LogInterceptor implements HandlerInterceptor {
*/ */
private LogDO logElapsedTimeAndException() { private LogDO logElapsedTimeAndException() {
LogContext logContext = LogContextHolder.get(); LogContext logContext = LogContextHolder.get();
if (logContext != null) { try {
LogContextHolder.remove(); if (logContext != null) {
LogDO logDO = new LogDO(); LogDO logDO = new LogDO();
logDO.setCreateTime(logContext.getCreateTime()); logDO.setCreateTime(logContext.getCreateTime());
logDO.setElapsedTime(System.currentTimeMillis() - LocalDateTimeUtil.toEpochMilli(logDO.getCreateTime())); logDO
logDO.setStatus(LogStatusEnum.SUCCESS); .setElapsedTime(System.currentTimeMillis() - LocalDateTimeUtil.toEpochMilli(logDO.getCreateTime()));
logDO.setStatus(LogStatusEnum.SUCCESS);
// 记录错误信息非未知异常不记录异常详情只记录错误信息 // 记录错误信息非未知异常不记录异常详情只记录错误信息
String errorMsg = logContext.getErrorMsg(); String errorMsg = logContext.getErrorMsg();
if (StrUtil.isNotBlank(errorMsg)) { if (StrUtil.isNotBlank(errorMsg)) {
logDO.setStatus(LogStatusEnum.FAILURE); logDO.setStatus(LogStatusEnum.FAILURE);
logDO.setErrorMsg(errorMsg); logDO.setErrorMsg(errorMsg);
}
// 记录异常详情
Exception exception = logContext.getException();
if (exception != null) {
logDO.setStatus(LogStatusEnum.FAILURE);
logDO.setExceptionDetail(ExceptionUtil.stacktraceToString(exception, -1));
}
return logDO;
} }
// 记录异常详情 } finally {
Exception exception = logContext.getException(); LogContextHolder.remove();
if (exception != null) {
logDO.setStatus(LogStatusEnum.FAILURE);
logDO.setExceptionDetail(ExceptionUtil.stacktraceToString(exception, -1));
}
return logDO;
} }
return null; return null;
} }