2016-07-06 43 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調用。 如果異步進入,這將無法正常工作。

我會使用像參數或持久性的便攜方式。