2016-07-06 46 views
0

我有一个InheritableThreadLocal变量,我想传递给由EJB容器的线程池分配的另一个子线程,作为对公共EJB方法的异步调用的结果。启动异步调用的父调用者是一个无状态EJB的REST资源。 只有当创建子线程为新时,InheritableThreadLocal才会将值传递给其子线程。一旦在池中创建了一个线程,它就不会销毁线程,直到服务器被反弹为止。将ThreadLocal变量传递给EJB容器线程池

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

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

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

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

Propagating ThreadLocal to a new Thread fetched from a ExecutorService

+0

如果您没有得到答案,请允许我建议添加一些代码片段,以便阅读的人员更容易确保他们正确地遵循。 –

回答

0

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

从我的角度来看,ThreadLocal被保存为一般容器使用同一个线程来处理一系列同步Servler/REST/EJB调用。 如果异步进入,这将无法正常工作。

我会使用像参数或持久性的便携方式。