【发布时间】:2016-11-09 00:16:42
【问题描述】:
我有一个 InheritableThreadLocal 变量,由于对公共 EJB 方法的异步调用,我想将它传递给由 EJB 容器的线程池分配的另一个子线程。发起异步调用的父调用者是一个 REST 资源,它是一个无状态 EJB。 InheritableThreadLocal 仅在创建新子线程时将值传递给其子线程。一旦在池中创建了一个线程,它就永远不会破坏该线程,直到服务器被反弹。
考虑到以上事实,我案例的子线程来自一个由 EJB 容器维护的线程池。 InheritableThreadLocal 仅在服务器启动后第一次调用 Resource 或将刚刚在 Threadpool 中创建的全新线程分配为子线程时才将值传递给其子线程。在所有其他情况下,当第一次创建和分配线程时,我会从池中获取分配给子线程的初始值。
我在 IBM WebSphere 上运行我的代码,并且不能在异步调用中将 ThreadLocal 值作为方法参数传递。
如何重新分配 ThreadLocal 值,以便每次运行时都可以获得分配给子线程的当前值?
我发现下面的链接有些相似,但就我而言,ThreadPool 是 EJB 容器提供的。
Propagating ThreadLocal to a new Thread fetched from a ExecutorService
【问题讨论】:
-
如果您没有得到答案,我建议您添加一些代码 sn-ps,以便阅读的人更容易确保他们正确地跟随。
标签: jakarta-ee asynchronous websphere ejb-3.0 thread-local