将ThreadLocal变量传递给EJB容器线程池

时间:2016-07-06 19:49:49

标签: java-ee asynchronous websphere ejb-3.0 thread-local

我有一个InheritableThreadLocal变量,我希望将该变量传递给另一个子EJB,该变量由EJB容器的Thread池分配,作为对公共EJB方法的Async调用的结果。启动Async调用的父调用者是REST资源,它是无状态EJB。  只有在创建子线程时,InheritableThreadLocal才会将值传递给其子线程。一旦在池中创建了一个线程,它就永远不会破坏线程,直到服务器被退回。

考虑到上述事实,我案例的子线程来自EJB容器维护的Threadpool。只有在服务器启动后第一次调用Resource或者刚刚在Threadpool中创建的全新Thread被分配为子线程时,InheritableThreadLocal才会将值传递给其子线程。在所有其他情况下,我获得初始值,当线程被创建并第一次分配时,从池中分配给子线程的初始值。

我在IBM WebSphere上运行我的代码并且将ThreadLocal值作为Async调用中的方法参数传递不是一个选项。

如何重新分配ThreadLocal值,以便每次运行时都能获得分配给子线程的当前值?

我发现下面的链接有些类似,但对于我的情况,ThreadPool是EJB容器提供的。

Propagating ThreadLocal to a new Thread fetched from a ExecutorService

1 个答案:

答案 0 :(得分:0)

使用ThreadLocal不是一种可移植的方式。您需要确切知道容器如何处理线程。

从我的角度来看,ThreadLocal是保存的,因为通常容器使用相同的线程来处理一系列同步Servler / REST / EJB调用。 如果Async发挥作用,这将无效。

我会使用像参数或持久性这样的可移植方式。