并发实用程序 (JSR 236) 已在 Java EE 7 中引入。
有什么办法可以将我的 EJB 注入(inject)到 Runnable/Callable 对象中吗?
特别是我想要这样的东西:
带有业务逻辑的ejb
@LocalBean
public class MyEjb {
public void doSomeStuff() {
... do some stuff ...
}
}
我想在其中注入(inject) 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 字段始终为空。我想这可以帮助 JNDI 查找,但是有什么正确的方法可以做到这一点吗?
最佳答案
您必须让容器有机会将 EJB 注入(inject)到您的任务实例中。您可以使用如下代码中的动态实例来执行此操作:
@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 的每个实例。
关于Java EE 7 - 注入(inject) Runnable/Callable 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21078616/