[英]Java EE 7 - Injection into Runnable/Callable object
並發實用程序(JSR 236)已在Java EE 7中引入。
有沒有辦法如何將我的EJB注入Runnable / Callable對象?
具體來說,我想要這樣的東西:
ejb與業務邏輯
@LocalBean
public class MyEjb {
public void doSomeStuff() {
... do some stuff ...
}
}
runnable / callable class我想要注入MyEjb的實例
public class MyTask implements Runnable {
@EJB
MyEjb myEjb;
@Override
public void run() {
...
myEjb.doSomeStuff();
...
}
}
啟動新任務的對象
@Singleton
@Startup
@LocalBean
public class MyTaskManager {
@Resource
ManagedExecutorService executor;
@PostConstruct
void init() {
executor.submit(new MyTask());
}
}
MyTask中的myEjb字段始終為null。 我想可以幫助JNDI查找,但有沒有正確的方法如何做到這一點?
您必須為容器提供將EJB注入Task實例的機會。 您可以使用此代碼中的動態實例來執行此操作:
@Stateless
public class MyBean {
@Resource
ManagedExecutorService managedExecutorService;
@PersistenceContext
EntityManager entityManager;
@Inject
Instance<MyTask> myTaskInstance;
public void executeAsync() throws ExecutionException, InterruptedException {
for(int i=0; i<10; i++) {
MyTask myTask = myTaskInstance.get();
this.managedExecutorService.submit(myTask);
}
}
因為您不使用new運算符創建實例,而是通過CDI的實例機制創建實例,所以容器在調用myTaskInstance.get()
時會准備MyTask的每個實例。
如果MyTask實例是由您創建的,則無法注入EJB,因為Container只知道自己創建的實例。 相反,您可以在MyTaskManager Singleton SB中注入EJB,並將MyTask Runnable類定義為內部類,如下所示:
@Singleton
@Startup
@LocalBean
public class MyTaskManager {
@Resource
ManagedExecutorService executor;
@EJB
MyEjb myEjb;
@PostConstruct
void init() {
executor.submit(new MyTask());
}
class MyTask implements Runnable {
@Override
public void run() {
...
myEjb.doSomeStuff();
...
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.