Я хочу использовать ThreadContext из log4j2 для установки ключей контекста MDC, таких как request-id
, user-id
, для отслеживания информации запроса в журналах для отладки.
Я написал MdcInterceptor
, который выполняет следующее:
public class MdcInterceptor implements ServerInterceptor {
@Override
public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(ServerCall<ReqT, RespT> call, Metadata headers,
ServerCallHandler<ReqT, RespT> next) {
ThreadContext.put("rid", generateId());
return next.startCall(call, headers);
}
}
К сожалению, это не работает, так как кажется, что разные колбэки могут вызываться из разных потоков из сервера-исполнителя с разными ThreadContext
с.
Я нашел какое-то решение, опубликованное здесь https://github.com/grpc/grpc-java/issues/1949#issuecomment-226884288, которое говорит, что ThreadContext
должно быть установлено при каждом обратном вызове в SimpleForwardingServerCallListener
.
Дело в том, что в моем случае некоторая дополнительная информация должна быть добавлена, если возможно, в другой UserInfoInterceptor
, который вызывается после MdcInterceptor
(некоторая информация для аутентифицированного пользователя, которая требует проверки токена и т. Д.). Как правильно добавить эту информацию в область запроса ThreadContext
?
Является ли опубликованное решение единственным возможным вариантом? Кажется немного странным, что я помещаю блок try-finally вокруг каждого супер-вызова в SimpleForwardingServerCallListener
, не говоря уже о том, что я должен устанавливать контекст не один раз, а в каждом обратном вызове.