В моем весеннем загрузочном Java-проекте у меня есть сотни API, которые в разных случаях вызывают другие API бэкенда.Эти вызовы происходят в параллельных потоках (внутри асинхронных методов CompletableFuture).В целях регистрации мне нужно регистрировать каждый вызов с уникальным идентификатором для одного сеанса, чтобы определить, какой бэкэнд-вызов был инициирован для какого сеанса.Обратите внимание, что несколько сеансов работают параллельно.(Механизм ведения журнала здесь не является моей задачей.)
Предположим: пользователь, используя мой Модуль, запросил некоторые данные.Это «сессия» в моем API.Мой модуль теперь автоматически назначит уникальный идентификатор (давайте назовем это «UID») для этого сеанса.Теперь предположим, что в параллельных потоках CompletableFuture было выполнено 15 различных запросов для извлечения данных с внутренних серверов для этого пользовательского запроса.Мне нужны журналы для каждого из этих вызовов, которые будут включать в себя этот UID.
Для того, чтобы сделать этот UID доступным глобально для механизма регистрации, в начале сеанса (уровень контроллера Spring API) я использовал MDC (Mapped Diagnostic)Context) и поместите это значение, используя
MDC.put ("uid", uid);
Теперь, когда в каком-то классе происходит асинхронный вызов, мне нужнопоместите это значение в MDC, как описано выше, чтобы сделать его доступным в новом потоке, а также в следующем порядке:
String uid = MDC.get("uid")
CompletableFuture.supplyAsync({
MDC.put("uid", uid)
... //some api related tasks
Хотя этот подход работает, он также проблематичен, так как мне нужно вручную добавлять эту строку внутри каждогоасинхронные вызовы.Это приводит к потере времени, сложному редактированию кодов, затрудняет будущие изменения, а также мне нужно приложить немало усилий.
Итак, мне нужно установить что-то вроде pointcut в аспектно-ориентированном программировании, где я определю это какположить значение в MDC после любого вызова асинхронного метода CompletableFuture вместо ручного добавления вышеуказанной строки в каждом случае, если это возможно каким-либо образом.
Есть идеи?