簡體   English   中英

Java EE 7 - 注入Runnable / Callable對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM