Java 如何使用线程上下文跨方法传递对象?
我希望在线程内的方法之间传递对象,而不使用方法签名 例如:Java 如何使用线程上下文跨方法传递对象?,java,dropwizard,mdc,Java,Dropwizard,Mdc,我希望在线程内的方法之间传递对象,而不使用方法签名 例如: public class Controller { @GET public void requestController() { // set user data in the controller currentThread } } public class Service { public void serviceMethod() { // get
public class Controller {
@GET
public void requestController() {
// set user data in the controller currentThread
}
}
public class Service {
public void serviceMethod() {
// get user data in the service method from currentThread
}
}
由于控制器
和服务
在同一个线程中,我应该能够访问服务
中设置在控制器
中的对象
MDC
确实遵循使用MDC.put
和MDC.get
的相同方法,但我不确定它使用的是哪种模式。您正在寻找一种新的模式。MDC在内部使用它
用法
用法非常简单。您需要一个ThreadLocal实例,所有需要访问该实例的组件都可以访问该实例。在大多数情况下,它只是一个公共静态final
变量
公共类SomeClass{
//在这里使用您想要的任何类,例如String
public static final ThreadLocal TL_MESSAGE=new ThreadLocal();
}
公共类控制器{
@得到
公共无效请求控制器(){
SomeClass.TL_MESSAGE.set(“hello world”);
试一试{
//设置后的所有内容都应包装在此try finally块中
service.serviceMethod();//这可以是代码中的任何地方,不必在这里直接调用。只要线程相同,并且方法在set和remove之间调用
}最后{
SomeClass.TL_MESSAGE.remove();
}
}
}
公务舱服务{
公共void服务方法(){
String message=SomeClass.TL_message.get();
}
}
陷阱/内存泄漏的可能性!
确保始终删除设置的值。
有关更多信息,请参阅:您正在寻找的。但是要小心使用,如果不这样做,很容易导致内存泄漏properly@codeflush.dev请详细说明内存泄漏部分,它可能会造成什么问题?另外,您可以添加一个
ThreadLocal
的示例吗?感谢您添加了这个示例,您知道为什么我们在写入ThreadLocal
时必须跟踪上一次操作吗?这是LogbackMDC
put
实现这是非常特定于Logback用例的。查看您共享的类中的注释和链接的票证。