Java EE 7 - 注入(inject) Runnable/Callable 对象

标签 java concurrency dependency-injection java-ee-7

并发实用程序 (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/

相关文章:

spring - Faker for Grails 给出变量未定义错误

java - 非目标绑定(bind)与 `toInstance()` 绑定(bind)

javascript - Aurelia辅助注入(inject)?

java - 如何在 Java 中使用 foreach 循环来遍历 HashMap 中的值?

java - 如何从 Java 启动独立、并发运行的 Python 进程

Python multiprocessing.Queue 放置和获取死锁

haskell - 分而治之算法的并行性

Java ProcessBuilder 无法执行我的命令

java - 如何设置 java.util.Date 的 fastTime?

eclipse - GWT-JRE-Emulated 类感知 Eclipse?