gpt4 book ai didi

java - 如何在 OSGi 中实现一个包,该包具有一个将值放入 ThreadContext 的类,以使这些值对其他包可见

转载 作者:行者123 更新时间:2023-12-02 01:18:24 26 4
gpt4 key购买 nike

总结一下这个问题,我在一个包中有一个公共(public)类,它在整个项目中使用。该类是一个 Aspect 类,它将值放入 ThreadContext(log4j2) 中,以便我们的日志记录将相应的 session 详细信息写入日志中。

我发现 ThreadContext 的工作方式类似于 ThreadLocal 变量。由于 OSGi 对于每个包都有不同的类加载器,因此 ThreadContext 值的调用者/用户根本无法看到这些值。

引用文献:

Effect of ThreadLocals and side-by-side classloading https://stackoverflow.com/a/34738856/8136561

我期望仍然有一个包含公共(public)代码的包,但其他包仍然能够看到放入 ThreadContext 中的值。我不确定这是否可能。

编辑:添加示例代码

Bundle1 (Common Code)

@Configurable
@Aspect
public class AspectLogger {

@Before("within(@org.springframework.stereotype.Controller *)")
public void beforeControllerAdvice(JoinPoint joinPoint) {
Object[] paramValues = null;
paramValues = joinPoint.getArgs();
Object request = null;
for (Object arg : paramValues) {
if (arg instanceof RenderRequest) {
request = arg;
} else if (arg instanceof ResourceRequest) {
request = arg;
} else if (arg instanceof ActionRequest) {
request = arg;
}
}

if (request != null) {
String transactionID = UUID.randomUUID().toString();
ThreadContext.put("transactionID", transactionID);
}
}
}

Bundle 2,3...n (Using this Aspect as a Bean)

<bean id="aspectLogger" class="shared.bundle.common.AspectLogger" />

Log4j2 configuration using this value for logger appenders (Problem values are empty in the logs)

<PatternLayout>
<Pattern>%-5p | %d{yyyy-MM-dd HH:mm:ss} | [%t] %c{2} (%F:%L) [transactionID: %X{transactionID}] - %m%n</Pattern>
</PatternLayout>

从调试器的角度来看,我可以看到 Controller 的线程和方面的线程基本相同。但我仍然没有得到这些值,我什至在 @Controller 级别尝试了 ThreadContext.get("transactionID") 但它是空的。

最佳答案

所以问题的原因是 log4j 嵌入到每个 war 文件中,然后部署到 OSGi。嵌入的类由相应的包加载。所以它们位于不同的类加载器中。

在 OSGi 中嵌入日志记录是一个坏主意。原因之一是您无法拥有中央日志记录配置。另一个原因就是上面的问题。

您可以将 pax-logging 或 felix logback 支持视为合适的 OSGi 日志记录解决方案。两者都提供 log4j API。

在您的 war files 中然后,您需要定义日志记录 api 包的导入。那么所有的 war 都应该使用来自同一个委托(delegate)类加载器的ThreadContext,并且问题应该得到解决。

关于java - 如何在 OSGi 中实现一个包,该包具有一个将值放入 ThreadContext 的类,以使这些值对其他包可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58177834/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com