【问题标题】:Passing a ThreadLocal variable to a EJB container Thread pool将 ThreadLocal 变量传递给 EJB 容器线程池
【发布时间】: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


【解决方案1】:

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

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

我会使用参数或持久性等可移植方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-29
    • 2011-06-01
    • 2013-09-25
    • 2015-05-05
    • 2015-09-18
    • 2011-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多