我們想優化我們的應用程序。有一些線性的線性工作正在進行,可以用更小的工作集在多個線程中執行。CDI多線程
我們的典型服務使用我們的CDI託管的豆中的@Inject
註釋進行訪問。而且,這種服務可以有它自己的依賴注入,即:
public class MyService {
@Inject
private OtherService otherService;
@Inject
private DataService1 dataService1;
...
public void doSomething() {
...
}
}
因爲我不能用@Inject
實現Runnable
裏面的類。 (它不是容器管理的。)我嘗試在啓動線程之前將所需的服務傳遞給類。因此,使用這樣的事情,使得服務實例(myService
)內螺紋可供選擇:
Class Thread1 implements Runnable{
private MyService myService
public Thread1(MyService myService){
this.myService = myService;
}
public void run(){
myService.doSomething();
}
}
繼呼叫層次調用doStometing()
是好的,因爲myService
參考已經過去了。就我所瞭解的CDI而言,注射是在屬性第一次被訪問的那一刻完成的,也就是說,當doStomething()
方法試圖訪問otherService
或dataService1
時,將執行注入。
但是,在這一點上,我收到一個例外,沒有可用的上下文。
我也嘗試使用JBossThreadExecuter
類而不是Plain-Threads - 它導致了相同的結果。
所以問題是,如果有一種很好的方式將上下文(或請求)與創建的Thread
關聯?
對於EJB-Beans,我讀到標記爲@Asynchronous
的方法將導致該方法在託管線程中運行,該線程本身將連接到上下文。這基本上就是我正在尋找的東西。
有沒有辦法在CDI中做到這一點?
或者有什麼方法可以從非託管線程中獲得context
?
注入的服務及其依賴關係的範圍是什麼? –
@JohnAment大部分都是'@ Stateless'。有些是'@ RequestScoped'。 – dognose