在Java 6中,是否存在某种线程有限的上下文,我可以在运行时在任何代码位置的当前线程中存储和检索对象?
我需要这个用于调试目的。我必须在EJB 2.0的EntityContext
中断言某个值,而正在调用的ejbStore()
与业务逻辑层的调用堆栈中的值相等。由于调试目的,无法通过接口本身规范传递数据。我怀疑缓存的实体bean在其上下文中包含错误的值。由于WebLogic可以控制处理实体bean池,缓存等,因此无法在当前事务中跟踪值的来源。
解决方案是将值放在业务层的线程有限存储中,并以ejbStore()
方法检索它以进行比较。这可能吗? 另外,我是否可以确定WebLogic不会为EntityBean回调生成新线程?前者特别重要,因为调试将在生产中完成,其中可能的值不匹配的原因必须明确无误
答案 0 :(得分:2)
听起来你正在寻找ThreadLocal<T>
,但我一般都会小心使用它 - 它可能导致代码,两个类之间的交互很难推理,它限制了你的方式稍后使用线程。 (例如,如果您决定并行化操作,那可能会使所有操作变得混乱。)
答案 1 :(得分:2)
正如已经写的那样,ThreadLocal可能是一种方法,假设事务上下文只绑定到一个线程,在大多数情况下都是如此。您甚至可以使用某些框架(如log4j)提供的MDC,这样的MDC使用ThreadLocals。
有趣的是,关于问题的第二部分,规范并不保证事务在一生中只被绑定到一个线程。
JTA规范其中包括以下内容:
多个线程可以同时与同一个全局关联 事务。
.....
请注意,某些事务管理器实现允许暂停 事务由另一个线程恢复。此功能不是 JTA要求。
不确定在现实生活中是否容易看到这种行为,但如果您认为可能是您的情况,那么您可以查看TransactionSynchronizationRegistry。这是一个example用法。