Class byte-buddy interceptors/advices 之间共享
Class sharing between byte-buddy interceptors/advices
我正在尝试通过 java 应用程序中的所有外部调用传递 monitoring/tracing 信息。
为了使其透明,我正在尝试使用 byte-buddy 但在使用时遇到了一些麻烦。
为了跟踪每个传入的 (http) 请求,我拦截 HttpServlet.service()
,从 HttpServletRequest
中提取令牌 header 并将其放入静态 ThreadLocal
中class 名为 TokenHolder
.
为了跟踪每个传出 (http) 请求,我拦截 HttpURLConnection
并添加令牌 header 我从同一个 ThreadLocal
(TokenHolder
).
我遇到的问题是 TokenHolder
似乎被初始化了两次而且我的 2 个拦截器 writing-to/reading-from 不一样 ThreadLocal
我找不到办法做到这一点.
我想问题是 HttpURLConnection
存在于引导 class 路径中,而 servlet API 不存在。
额外问题:是否可以拦截 URL.openConnection()
?这是我的第一个想法,但我永远做不到,因为我想 URL
class 是在代理之前加载的(因为 URLClassLoader
),但我不知道是否有解决方法那。
是的,您可以注册一个 RedefinitionStrategy
,其中 Byte Buddy 转换之前加载的 类。为此,您需要避免添加方法或字段。这通常可以通过仅使用 Advice
来完成。
你说得对 类 需要在 bootstrap 装载机上生存。您可以将 类 放入 bootstrap 加载器,方法是将它们放入 jar 中并使用 Instrumentation
接口中的指定方法。
我正在尝试通过 java 应用程序中的所有外部调用传递 monitoring/tracing 信息。 为了使其透明,我正在尝试使用 byte-buddy 但在使用时遇到了一些麻烦。
为了跟踪每个传入的 (http) 请求,我拦截 HttpServlet.service()
,从 HttpServletRequest
中提取令牌 header 并将其放入静态 ThreadLocal
中class 名为 TokenHolder
.
为了跟踪每个传出 (http) 请求,我拦截 HttpURLConnection
并添加令牌 header 我从同一个 ThreadLocal
(TokenHolder
).
我遇到的问题是 TokenHolder
似乎被初始化了两次而且我的 2 个拦截器 writing-to/reading-from 不一样 ThreadLocal
我找不到办法做到这一点.
我想问题是 HttpURLConnection
存在于引导 class 路径中,而 servlet API 不存在。
额外问题:是否可以拦截 URL.openConnection()
?这是我的第一个想法,但我永远做不到,因为我想 URL
class 是在代理之前加载的(因为 URLClassLoader
),但我不知道是否有解决方法那。
是的,您可以注册一个 RedefinitionStrategy
,其中 Byte Buddy 转换之前加载的 类。为此,您需要避免添加方法或字段。这通常可以通过仅使用 Advice
来完成。
你说得对 类 需要在 bootstrap 装载机上生存。您可以将 类 放入 bootstrap 加载器,方法是将它们放入 jar 中并使用 Instrumentation
接口中的指定方法。