Могу ли я поместить аспектно-ориентированный pointcut на каждый асинхронный вызов CompletableFuture? - PullRequest
0 голосов
/ 25 сентября 2018

В моем весеннем загрузочном 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 вместо ручного добавления вышеуказанной строки в каждом случае, если это возможно каким-либо образом.

Есть идеи?

...