Совместное использование классов между перехватчиками / советниками - PullRequest
0 голосов
/ 24 мая 2019

Я пытаюсь передать информацию мониторинга / отслеживания через все мои внешние вызовы в моем java-приложении. Чтобы сделать его прозрачным, я пытаюсь использовать byte-buddy, но у меня возникают проблемы с его работой.

Чтобы отследить каждый входящий (http) запрос, я перехватываю HttpServlet.service(), извлекаю заголовок токена из HttpServletRequest и помещаю его в статический ThreadLocal в классе с именем TokenHolder.

Чтобы отследить каждый исходящий (http) запрос, я перехватываю HttpURLConnection и добавляю заголовок токена, полученный от того же ThreadLocal (TokenHolder).

Проблема, с которой я столкнулся, заключается в том, что TokenHolder, кажется, инициализируется дважды, и мои 2 перехватчика не записывают / читают с одного и того же ThreadLocal, и я не могу найти способ сделать это.

Полагаю, проблема в том, что HttpURLConnection живет в пути начальной загрузки, а API сервлета нет.

Бонусный вопрос: можно ли перехватить URL.openConnection()? Это была моя первая идея, но я никогда не мог сделать это, потому что я полагаю, что класс URL загружается перед агентом (из-за URLClassLoader), но я не знаю, есть ли обходные пути для этого.

1 Ответ

0 голосов
/ 24 мая 2019

Да, вы можете зарегистрировать RedefinitionStrategy, где Byte Buddy преобразует ранее загруженные классы.Однако для этого вам необходимо избегать добавления методов или полей.Обычно это можно сделать, используя только Advice.

Вы также правы, что классы должны жить в загрузчике начальной загрузки.Вы можете добавить классы в загрузчик начальной загрузки, поместив их в jar-файл и используя назначенный метод в интерфейсе Instrumentation.

...